- PR -

javaアプリケーションからのEJB実行について

1
投稿者投稿内容
untama
会議室デビュー日: 2005/03/09
投稿数: 3
投稿日時: 2005-03-09 19:15
はじめまして、よろしくお願いします。
以下の内容の解決方法がわからず困っています。

クライアントマシンのswingを使用したjavaアプリケーションから
サーバマシンに配置したEJBを実行しようとしています。

クライアントとサーバをLANで接続した場合はEJBが実行されるのですが、
サーバをルータとADSLモデムを、クライアントはAir H"を使用して
WANで接続した場合はConnectExceptionが発生し、EJBが実行されません。

表示されるエラーに
javax.naming.CommunicationException [Root exception is java.rmi.ConnectException:
Connection refused to host: <サーバのローカルIP>;
とあり、ルータが変換した<サーバのローカルIP>へ接続しようとして
タイムアウトになっているようです。

クライアントでEJBを実行する際のContext作成時に「java.naming.provider.url」には
「jnp://<ルータに設定したグローバルIP>:1099」を設定しています。

サーバとクライアントでパケットのやり取りをしているので、
クライアント→サーバ:ホームオブジェクト要求
サーバ→クライアント:実態のアドレス(<サーバのローカルIP>)返信
クライアント→サーバ:<サーバのローカルIP>へ接続・・・タイムアウト
となっているかと思われるのですが解決方法がわかりせん。



クライアントとサーバの構成は次の通りです。

クライアント(ノートPC)
・windows xp
・j2sdk1.4.2_06

サーバ
・windows 2003 server
・jboss-3.2.1_tomcat-4.1.24
・j2sdk1.4.2_06



javaの開発環境は次の通りです。

・windows xp
・j2sdk1.4.2_06
・eclipse3.0.1
・lomboz.301
・jboss-3.2.1_tomcat-4.1.24



以下が発生したエラーの内容です。

javax.naming.CommunicationException [Root exception is java.rmi.ConnectException: Connection refused to host: <サーバのローカルIP>; nested exception is:
java.net.ConnectException: Connection timed out: connect]
at jp.co.bbm.spos.maintenance.local.common.ejbaccess.MessageSpotCdQueryEjbAccess.access(MessageSpotCdQueryEjbAccess.java:84)
at jp.co.bbm.spos.maintenance.local.SposClientMain.main(SposClientMain.java:82)
Caused by: javax.naming.CommunicationException [Root exception is java.rmi.ConnectException: Connection refused to host: <サーバのローカルIP>; nested exception is:
java.net.ConnectException: Connection timed out: connect]
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:611)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:471)
at javax.naming.InitialContext.lookup(Unknown Source)
at jp.co.bbm.spos.maintenance.local.common.ejbaccess.MessageSpotCdQueryEjbAccess.getHome(MessageSpotCdQueryEjbAccess.java:40)
at jp.co.bbm.spos.maintenance.local.common.ejbaccess.MessageSpotCdQueryEjbAccess.access(MessageSpotCdQueryEjbAccess.java:75)
... 1 more
Caused by: java.rmi.ConnectException: Connection refused to host: <サーバのローカルIP>; nested exception is:
java.net.ConnectException: Connection timed out: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
at org.jnp.server.NamingServer_Stub.lookup(Unknown Source)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:492)
... 5 more
Caused by: java.net.ConnectException: Connection timed out: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown Source)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source)
... 11 more
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-03-10 04:05
JBossには明るくないのですが、フロントエンドのホスト名を設定するような項目がサーバにあるのではないでしょうか?
はたは、WebServices としてメソッド呼び出しを行うとか。

[ メッセージ編集済み 編集者: インギ 編集日時 2005-03-10 04:08 ]
typer
会議室デビュー日: 2003/09/30
投稿数: 13
投稿日時: 2005-03-10 12:39
JBossの起動オプションに以下のオプションを加えてみたらどうなりますか?

-Djava.rmi.server.hostname=<サーバのグローバルIPアドレス>
untama
会議室デビュー日: 2005/03/09
投稿数: 3
投稿日時: 2005-03-10 14:20
ご返答ありがとうございます。


>JBossには明るくないのですが、フロントエンドのホスト名を設定するような項目がサーバにあるのではないでしょうか?

<JBOSS_DIST>\server\default\conf\jndi.propertiesにそのようなプロパティを
設定すればよいかと思って調べたのですがわかりませんでした。
「java.naming.provider.url」はデフォルトでは
# Do NOT uncomment this line as it causes in VM calls to go over
# RMI!
#java.naming.provider.url=localhost
となっていますのでそのままにしています。
「java.naming.provider.url=localhost」または
「java.naming.provider.url=<サーバのローカルIP>」とした場合は
JBOSSは正常に起動し、LAN内ならばEJBが動くのですが、
「java.naming.provider.url=<サーバのグローバルIPアドレス>」とした場合は
JBOSSは正常に起動しませんでした。


>はたは、WebServices としてメソッド呼び出しを行うとか。

現在の方式の解決方法がわからない場合はSOAP等を使用する必要もあるかと思っています。



>JBossの起動オプションに以下のオプションを加えてみたらどうなりますか?
>
>-Djava.rmi.server.hostname=<サーバのグローバルIPアドレス>

上記の記述を入れても同様の例外が発生してしまいました。
一応記述する場所を変えて実行してみましたがだめでした。

@java -Djava.rmi.server.hostname=<サーバのグローバルIPアドレス> -cp <クラスパス> <実行クラス>
Ajava -cp <クラスパス> -Djava.rmi.server.hostname=<サーバのグローバルIPアドレス> <実行クラス>
Bjava -cp <クラスパス> <実行クラス> -Djava.rmi.server.hostname=<サーバのグローバルIPアドレス>
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-03-10 14:46
jndi.properties は恐らく JBoss 内からどこの JNDI ツリーを見に行くかどうかを設定するものですね。
クライアントには関係ありません。

グローバルのIPアドレスを設定したらローカルのJNDIツリーを検索出来なくなってしまうので不整合が生じてしまっているのでしょう。
untama
会議室デビュー日: 2005/03/09
投稿数: 3
投稿日時: 2005-03-25 13:16
下記の二つの状況で確認してみました。

@サーバー機をH"からWANにつなぎ、ファイアーウォールを無効にした場合はEJB呼出しができました。
Aまた、ファイアーウォールを有効にしてJNPポートの1099を通す設定にした場合はEJB呼び出しができませんでした。

そこでJBOSSが他のポートも使用しているのを調査するために
@の状況でEJB呼び出しができた後にクライアント側でnetstatコマンドを実行したところ、1099以外に3349のポートとも通信を行っていることがわかりました。
しかしJBOSSを再起動してnetstatコマンドを実行したところ今度は1099と3413のポートと通信をおこなっていて、
再起動するたびに1099以外のポートが変わります。


JBOSSのプロパティに固定で設定する箇所を探してみました。

1.jboss-service.xmlのRmiPort
以下の設定を追加してみましたが通信しているポートが
1099、3522、xxxx(再起動時に変わるポート)の3つになっただけでだめでした。

<!-- ==================================================================== -->
<!-- JNDI -->
<!-- ==================================================================== -->

<mbean code="org.jboss.naming.NamingService"
name="jboss:service=Naming">
<attribute name="Port">1099</attribute>
<attribute name="RmiPort">3522</attribute>
</mbean>

2.iiop-service.xmlとjacorb.properties
allフォルダにある以下のファイルをdefaultフォルダにコピーして設定を行いましたがだめでした。

ファイル
 iiop-service.xml
 jacorb.properties
 jacorb.jar
 jboss-iiop.jar

設定(jacorb.properties)
jacorb.net.socket_factory.port.min=3530
jacorb.net.socket_factory.port.max=3531


質問1
今回の環境のような場合、EJBを使用する時に意識しなければならないポートは以下の2つなのか?
 JNP:1099
 RMI-IIOP?:xxxx(再起動時に変わるポート)

質問2
JBOSSでRMI-IIOPのポートを固定で設定するためのプロパティはどれか?

質問3
JBOSS以外のアプリケーションサーバーを使用した場合、RMI-IIOPのポートの設定を行うプロパティはあるのか?
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-03-25 13:52
>質問3
>JBOSS以外のアプリケーションサーバーを使用した場合、RMI-IIOPのポートの設定を行うプロパティはあるのか?
WebLogic Server ではデフォルトでは HTTP と同じ通常のリスンポートになります。
通常のリスンポートでの RMI-IIOP を無効にして、別途明示的にポートを空けることができる、ネットワークチャネルという機能もあります。
・WebLogic Server の RMI-IIOP 用コンフィグレーション
http://edocs.beasys.co.jp/e-docs/wls/docs81/rmi_iiop/rmiiiop3.html
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2005-03-25 14:24
ちらっとだけ調べてみると、visibrokerとかにも機能はあるみたいです。
一般的にHTTPトネリング機能って言うんですかね。

JBOSSにその機能があるかどうかは見つけられませんでした。
1

スキルアップ/キャリアアップ(JOB@IT)