- PR -

jboss+tomcat クライアント側からリモートでアクセス(解決)

投稿者投稿内容
優子
常連さん
会議室デビュー日: 2004/03/26
投稿数: 39
投稿日時: 2004-06-22 12:10
はじめまして、よろしくお願いします。


リモートクライアント(TOMCATを用いたサーブレットから)で別のEJBサーバにアクセスしようとしています。

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

クライアント
・WINDOWS XP
・TOMCAT 4.1
・J2SDK 1.4.2_04

サーバ
・WINDOWS XP
・JBOSS 3.0.7
・J2SDK 1.4.2_04


クライアント側(TOMCAT_HOME\WEBAPPS\クライアント.WAR)にJBOSS_HOME\client内のjarファイルをセットし、jndiの設定もコーディングしたのですが、実行後、

javax.naming.CommunicationException: Receive timed out [Root exception is java.net.SocketTimeoutException: Receive timed out]

と表示されてしまいました。

サーバと通信はされているようなのですが、サーバからの反応を待っている間にタイムアウトしたようです。

そうすると、クライアント側でタイムアウトの値を変更すれば、タイムアウトせずに実行されると思うのですが、その設定方法をどなたかご教授願いませんでしょうか?

私の解釈が間違って入れば、その点もご指摘ください。

よろしくお願いいたします。

[ メッセージ編集済み 編集者: 優子 編集日時 2004-06-22 13:44 ]

[ メッセージ編集済み 編集者: 優子 編集日時 2004-06-24 15:50 ]
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-06-22 13:50
JNDIのlookupでタイムアウトになっているようですが、JNDIの呼び出しはどのようにしている
のでしょうか? サーブレットでやる前に、まずコンソールアプリかなにかでテストしてみては?
優子
常連さん
会議室デビュー日: 2004/03/26
投稿数: 39
投稿日時: 2004-06-22 14:53
UKさん、ご返事どうもありがとうございました。


ご指摘のあった点ですが、クライアントのサーブレットに、

Hashtable properties = new Hashtable();
properties.put("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
properties.put("java.naming.provider.url","http://EJBサーバのipアドレス:1099");
properties.put"java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");

initContext = new InitialContext(properties);
Object ref = initContext.lookup(JNDI_NAME);
Object obj = PortableRemoteObject.narrow(ref, CounterHome.class);


このようにハードコーディングしました。

最初は、
properties.put("java.naming.provider.url","http://EJBサーバのipアドレス:1099");
の部分を、
properties.put("java.naming.provider.url","EJBサーバのipアドレス:1099");
としていたのですが、その場合、tomcatが

javax.naming.CommunicationException
[Root exception is java.rmi.ServerException: RemoteException occurred in server thread;
nested exception is:java.rmi.UnmarshalException: error unmarshalling arguments;
nested exception is:java.net.MalformedURLException: no protocol: Files/Apache]

というエラーを発生していたのです。

リモートクライアントが、EJBサーバーとアクセスするプロトコルは、サーブレットを使用している所から推測してhttpではないかと思い、且つ、
MalformedURLExceptionがURLの書式が無効であることを表すので、
properties.put("java.naming.provider.url","EJBサーバのipアドレス:1099");
にhttp://を追加した、
properties.put("java.naming.provider.url","http://EJBサーバのipアドレス:1099");

という記述にしてみたのです。


ちなみに、コンソールアプリケーションからも実行を試してみて、そちらは成功しています。その時のJNDI指定は、
properties.put("java.naming.provider.url","EJBサーバのipアドレス:1099");
のままで上手くいきました(リモート・同じEJBサーバ上どちらも成功)。


さらに追加で、同じEJBサーバ上で、
properties.put("java.naming.provider.url","http://EJBサーバのipアドレス:1099");
としてみると、最初の記事で申したようにタイムアウトしてしまいました。


http:と記述するのは何かを参考にしたという事ではありません、私の我流です。。
でも元に戻すとURL指定が違うと言われるのが引っかかります。


[ メッセージ編集済み 編集者: 優子 編集日時 2004-06-22 15:03 ]

[ メッセージ編集済み 編集者: 優子 編集日時 2004-06-22 15:05 ]
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-06-22 16:07
引用:

優子さんの書き込み (2004-06-22 14:53) より:
リモートクライアントが、EJBサーバーとアクセスするプロトコルは、サーブレットを使用している所から推測してhttpではないかと思い、且つ、
MalformedURLExceptionがURLの書式が無効であることを表すので、
properties.put("java.naming.provider.url","EJBサーバのipアドレス:1099");
にhttp://を追加した、
properties.put("java.naming.provider.url","http://EJBサーバのipアドレス:1099");

という記述にしてみたのです。


JNDIのプロトコル指定でもっとも一般的なのはIIOPですが、JBossの場合はJNPというプロトコル
のようですね。ですので、jnp:というプレフィックスをつけてみてください。
優子
常連さん
会議室デビュー日: 2004/03/26
投稿数: 39
投稿日時: 2004-06-22 16:26
ukさん、ご返答ありがとうございました。

properties.put("java.naming.provider.url","jnp://EJBサーバのipアドレス:1099");
と変更してみたところ、同じEJB上からではアクセスできるようになったのですが、リモートからでは、tomcatが、

javax.naming.CommunicationException
[Root exception is java.rmi.ServerException: RemoteException occurred in server thread;
nested exception is:java.rmi.UnmarshalException: error unmarshalling arguments;
nested exception is:java.net.MalformedURLException: no protocol: Files/Apache]

というメッセージを出しました
(つまり、一番最初に実装していた方法の、
properties.put("java.naming.provider.url","EJBサーバのipアドレス:1099"); の時の結果と同じという事です)。



EJBサーバでは実行でき、クライアントからではだめ(コンソールからではOK)という状態は変わりませんでした。

java.net.MalformedURLException: no protocol: Files/Apache] のno protocol: Files/Apacheが気になります。でもApacheなんて使ってないのに。。。

EJBサーバのコンテナにはjettyを使っていますが、これがクライアントの方のコンテナに当たるtomcatと違うから駄目、っていうことはないですよね?

uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-06-22 16:37
結果だけ見ると、JBossのクライアントクラスを認識できていないのかな、と思います。
JBossのクライアントjarファイルをWar内ではなく%TOMCAT_HOME%/common/libに入れてみたら
どうなるでしょうか?
優子
常連さん
会議室デビュー日: 2004/03/26
投稿数: 39
投稿日時: 2004-06-22 17:36
ukさん、度々申し訳ありません。

/common/libに入れて実行しても、やはり、
javax.naming.CommunicationException [Root exception is java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:java.net.MalformedURLException: no protocol: Files/Apache]

となり、同様の結果になってしまいました。

typer
会議室デビュー日: 2003/09/30
投稿数: 13
投稿日時: 2004-06-23 11:06
"jnp://EJBサーバのipアドレス:1099"の部分を"jnp://EJBサーバのipアドレス:1099/"と
言う風に、最後にスラッシュを入れたらどうなりますか?

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