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のデプロイが後だと失敗します。