1 月 13

Tomcat6でコネクションプール(コネクションプーリング、Connection pooling)を使うことにしました。

動作環境
Windows XP Pro
eclipse 3.3.0 (Eclipse Java EE IDE for Web Developers)
Tomcat 6.0 (インストーラ:apache-tomcat-6.0.20.exe)
MySQL 5.0.77 (VmWare Linux上にインストール NAT接続)

構築方法
1.META-INF配下に、context.xmlを作成する。

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/struts2" docBase="struts2"
        debug="5" reloadable="true" crossContext="true">
        <Resource
                name="jdbc/TestDB"
                auth="Container"
                type="javax.sql.DataSource"
                username="dbuser"
                password="dbpass"
                driverClassName="com.mysql.jdbc.Driver"
                url="jdbc:mysql://192.168.169.128:3306/dbname?autoReconnect=true"
                maxActive="20"
                maxWait="5000"
                maxIdle="20"
        />
</Context>

/struts2は、http://localhost:8080/struts2 というコンテキストで使用することを意味します。

2. MySQLのサイトからJDBCドライバを入手する。
入手したドライバ:mysql-connector-java-5.1.10.tar.gz
gzを展開すると、mysql-connector-java-5.1.10-bin.jarというライブラリが入っているので、このjarファイルを
${TOMCAT_HOME}/lib配下にコピーする。

3.ソースコードにLookupするコードを記述する

package test;

public class Test {

	private DataSource testDs;

	public String getDataSource() {
		try {
			InitialContext initCtx = new InitialContext();
			Context envCtx = (Context) initCtx.lookup("java:comp/env");
			testDs = (DataSource) envCtx.lookup("jdbc/TestDB");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "hello";
	}
}

struts2で@Resourceアノテーションを使用すると、DataSourceがlookupできない(なぜ?)ため、
上記のようにContextから取得しています・・が、DataSourceはstaticで1回取得するだけなんでContext取得で十分ですね Q44
動作としても、一般的なコネクションプールの動作と同じで使える目処が立ちました。




11 月 26

EJBのリモート接続を行うと、SocketExceptionが発生してしまう場合の対処法です。

こんな場合です
jnp://127.0.0.1:1099/HogeEJB/HogeBean/remote   は接続できるのに、
jnp://192.168.169.128:1099/HogeEJB/HogeBean/remote   はできない・・・

ファイアーウォール設定してないのに・・・・
> telnet 127.0.0.1 1099  はつながるのに・・・・
> telnet 192.168.169.128 1099  はつながらない

動作環境
VMWare Linux CentOS 5.3
Apache 2.2.3 (プリインストール)
JBoss 5.1

参考URL
http://questionbox.jp.msn.com/qa3043009.html

対処法
JBoss起動時にバインドポートを指定する

cd /usr/local/jboss/bin
./run.sh -b 0.0.0.0 

これですべてのアドレスからアクセスできるはずです。
ローカルのdevelopment環境はこれでOKでしょう・・・。




11 月 26

@EJB(EJBアノテーション)を使った、外部EJB参照の覚書です。

動作環境
VMWare Linux CentOS 5.3
Apache 2.2.3 (プリインストール)
JBoss 5.1

デプロイ構成 /usr/local/jboss/server/default/deploy
MyEJBServer.ear (myejb.jarを含むearファイル)
+ myejb.jar
  + jp/co/domain/MyBean.class
  + jp/co/domain/MyInterface.class

MyServlet.war 
+ WEB-INF
  + classes
    + jp/co/domain/MyServlet.class ←MyInterfaceをインスタンス化するクラス
  + lib ←外部参照の場合EJBのクラスが入ったjar(ここではmyejb.jar)は入れてはいけない 大事 はまった
  + jboss-web.xml ←大事
  + web.xml

解決策

MyServlet.java

class MyServlet extends HttpServlet {
    @EJB(name="MyInterface")  // (nameにjboss-web.xmlに記述したejb-ref-nameを記述する)
    MyInterface myejb = null;

    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
    }
     :  (省略)
}

jboss-web.xml

<div class="coderect"><jboss-web>
    <ejb-ref>
        <ejb-ref-name>MyInterface</ejb-ref-name>
        <jndi-name>jnp://127.0.0.1:1099/MyEJBServer/MyBean/remote</jndi-name>
    </ejb-ref>
</jboss-web></div>

・異なるサーバーのEJBにアクセスする場合は、jnp://127.0.0.1:1099/を変えればよいかと・・・・
・上記MyEJBServer/MyBean/remoteはJNDI名ですので、JBossでJNDI名を確認してください。
(JNDI名の確認方法)
1.http://localhost:8080/ へアクセス
2.「Object Name Filter」のjbossを選択
3.service=JNDIViewを選択
4.「list」という行の「Invoke」を押下
5.「Global JNDI Namespace」を検索して見つける
6.下記のようなノードから参照したいEJBのJNDI名見つける

  +- UserTransactionSessionFactory (proxy: $Proxy253 implements interface org.jboss.tm.usertx.interfaces.UserTransactionSessionFactory)
  +- MyEJBServer (class: org.jnp.interfaces.NamingContext)
  |   +- MyBean (class: org.jnp.interfaces.NamingContext)
  |   |   +- remote (class: Proxy for: jp.co.domain.MyInterface)
  |   |   +- remote-jp.co.domain.MyInterface (class: Proxy for: jp.co.domain.MyInterface)

その他注意
・ServletコンストラクタやFilterのコンストラクタで@EJBでEJBを生成する場合、生成に失敗するとデプロイが失敗します。
・ServletコンストラクタやFilterのコンストラクタで@EJBでEJBを生成する場合、EJBクラスを含むwarのデプロイが後だと失敗します。