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取得で十分ですね 
動作としても、一般的なコネクションプールの動作と同じで使える目処が立ちました。
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のデプロイが後だと失敗します。