- PR -

■JBOSSで作成したセッションビーンに外部からアクセスするとlookupに失敗します。

1
投稿者投稿内容
Hyde
ベテラン
会議室デビュー日: 2005/05/18
投稿数: 63
投稿日時: 2005-05-24 20:31
正しくJNDIを使いこなせていないためだと思われるのですが、外部からremoteタイプでStatelessなセッションビーンを
見にいけなくて困っております。Local的な呼び出し時にはJNDI名は取り出せていたようなのですが、クライアントから
アクセスしようとした瞬間、たどり着けなくなりました。いろいろと試行錯誤してみたのですがうまくいきません。
どうやらlookupできないようなのです。
今JBOSS(v 3.2.5)をeclipseで立ち上げ、特定のセッションビーン(Fos2FecBean)に対してアクセスする
クライアント(RMIClient)を作成し、クライアントモジュールのほうは、コンソールからキックするようにしてみました。
接続先のJBOSSサーバーのIPアドレス(fecIp)だけパラメータ設定できるようにして

【コーディング】
◆InitialContextをProperties引数つきコンストラクタを使用した場合

Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
env.put(Context.PROVIDER_URL, "iiop://" + fecIp +":900");
Context initial = new InitialContext(env);
Object obj = initial.lookup(Fos2FecHome.JNDI_NAME);//COMP_NAME JNDI_NAME
・・・


【実行】
クライアントをキックするのに必要なJARをとりあえず拾い集め
set JBOSS_CLIENT=%JBOSS_HOME%\client
set JBOSS_CP=
set JBOSS_CP=%JBOSS_CP%;%JBOSS_CLIENT%\jboss-client.jar
set JBOSS_CP=%JBOSS_CP%;%JBOSS_CLIENT%\jboss-common-client.jar
set JBOSS_CP=%JBOSS_CP%;%JBOSS_CLIENT%\jbosssx-client.jar
set JBOSS_CP=%JBOSS_CP%;%JBOSS_CLIENT%\jboss-jaas.jar
set JBOSS_CP=%JBOSS_CP%;%JBOSS_CLIENT%\jboss-j2ee.jar
set JBOSS_CP=%JBOSS_CP%;%JBOSS_CLIENT%\jnp-client.jar
set JBOSS_CP=%JBOSS_CP%;%JBOSS_CLIENT%\jnet.jar
set JBOSS_CP=%JBOSS_CP%;%JBOSS_CLIENT%\log4j.jar
set FEC_CLIENT_CP=%JBOSS_CP%;%FEC_MODULE%

java -classpath %FEC_CLIENT_CP% fec.RMIClient 172.xx.xx.xx 2> a.txt

のようにしたところ、lookup でCommunicationExceptionが発生し、落ちてしまいます。

【結果】
log4j:WARN No appenders could be found for logger (org.jnp.interfaces.NamingContext).
log4j:WARN Please initialize the log4j system properly.
javax.naming.CommunicationException: Receive timed out [Root exception is java.net.SocketTimeoutException: Receive timed out]
at org.jnp.interfaces.NamingContext.discoverServer(NamingContext.java:1119)
at org.jnp.interfaces.NamingContext.checkRef(NamingContext.java:1196)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:516)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:509)
at javax.naming.InitialContext.lookup(Unknown Source)
at fec.RMIClient.communicateFEC(RMIClient.java:182)
at fec.RMIClient.main(RMIClient.java:50)
Caused by: java.net.SocketTimeoutException: Receive timed out
at java.net.PlainDatagramSocketImpl.receive0(Native Method)
at java.net.PlainDatagramSocketImpl.receive(Unknown Source)
at java.net.DatagramSocket.receive(Unknown Source)
at org.jnp.interfaces.NamingContext.discoverServer(NamingContext.java:1089)
... 6 more


何か設定で足りないところなどあるのでしょうか。
お分かりの方がいらっしゃいましたら、よろしくご教授ください。よろしくお願いいたします。

INITIAL_CONTEXT_FACTORYに関しても他にもいろいろとあると思うのですが、
現在使用しているJBOSSサーバーのデプロイ環境でjava.naming.factory.initialをGREPしてみると
jms-ds.xmlというファイルしかHITせず、org.jnp.interfaces.NamingContextFactoryでした。

他に、com.sun.jndi.cosnaming.CNCtxFactoryも試してみましたが、これもだめでした。


<!-- The JMS provider loader -->
<mbean code="org.jboss.jms.jndi.JMSProviderLoader"
name="jboss.mq:service=JMSProviderLoader,name=JMSProvider">
<attribute name="ProviderName">DefaultJMSProvider</attribute>
<attribute name="ProviderAdapterClass">
org.jboss.jms.jndi.JNDIProviderAdapter
</attribute>
<!-- The queue connection factory -->
<attribute name="QueueFactoryRef">java:/XAConnectionFactory</attribute>
<!-- The topic factory -->
<attribute name="TopicFactoryRef">java:/XAConnectionFactory</attribute>
<!-- Uncomment to use HAJNDI to access JMS
<attribute name="Properties">
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost:1100
</attribute>
-->
</mbean>

【環境】
Windows XP SP2
eclipse 3.0.1
jboss 3.2.5



他に試してみたこと。これはこれでだめなのだと思いますが。
【コーディング】
◆InitialContextをデフォルトコンストラクタを使用した場合

Context initial = new InitialContext();
Object obj = initial.lookup(Fos2FecHome.JNDI_NAME);//COMP_NAME JNDI_NAME

【結果】
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.lookup(Unknown Source)
at fec.RMIClient.communicateFEC(RMIClient.java:182)
at fec.RMIClient.main(RMIClient.java:50)
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-05-24 21:05
Firewall ではじかれているということはないでしょうか?
Hyde
ベテラン
会議室デビュー日: 2005/05/18
投稿数: 63
投稿日時: 2005-05-24 21:30
インギさんレスありがとうございます。
ファイアーウォールは無効にしてあります。

■再挑戦してみた結果報告です。
InitialContextのコンストラクタ引数を以下に変更して再度試してみたのですが
env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");// 変更せず

env.put(Context.PROVIDER_URL, "iiop://" + fecIp +":900");// 変更前

env.put(Context.PROVIDER_URL, "" + fecIp +":1099");// 変更後
に変更し

env.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");// 追加
を追加すると

例外の結果が少し変わりました。

Exception in thread "main" java.lang.NoClassDefFoundError: Lorg/jboss/tm/TransactionPropagationContextFactory;
at java.lang.Class.getDeclaredFields0(Native Method)
at java.lang.Class.privateGetDeclaredFields(Unknown Source)
at java.lang.Class.getDeclaredField(Unknown Source)
at java.io.ObjectStreamClass.getDeclaredSUID(Unknown Source)
at java.io.ObjectStreamClass.access$600(Unknown Source)
at java.io.ObjectStreamClass$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.io.ObjectStreamClass.<init>(Unknown Source)
at java.io.ObjectStreamClass.lookup(Unknown Source)
at java.io.ObjectStreamClass.initNonProxy(Unknown Source)
at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
at java.io.ObjectInputStream.readClassDesc(Unknown Source)
...
at java.rmi.MarshalledObject.get(Unknown Source)
at org.jnp.interfaces.MarshalledValuePair.get(MarshalledValuePair.java:30)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:552)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:509)
at javax.naming.InitialContext.lookup(Unknown Source)
at fec.RMIClient.communicateFEC(RMIClient.java:188)
at fec.RMIClient.main(RMIClient.java:50)

Factoryが違うのでしょうか。。。?
Hyde
ベテラン
会議室デビュー日: 2005/05/18
投稿数: 63
投稿日時: 2005-05-24 22:06
自己解決いたしました!!

set JBOSS_CP=%JBOSS_CP%;%JBOSS_CLIENT%\jboss-transaction-client.jar

を追加したらいけました。
jboss 3.2.5 ではこのJARを含めないとこけるんですね。。。
勉強になりました。
お騒がせいたしました。

uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-05-24 22:08
JBossなら、プロバイダURLはjnp://IPアドレス:1099ではないですか?
Hyde
ベテラン
会議室デビュー日: 2005/05/18
投稿数: 63
投稿日時: 2005-05-24 22:15
env.put(Context.PROVIDER_URL, "" + fecIp +":1099");//
でいけてしまったのですが、
jnp://IPアドレス:1099
も試してみますね。。。

Hyde
ベテラン
会議室デビュー日: 2005/05/18
投稿数: 63
投稿日時: 2005-05-24 22:46
jnp://IPアドレス:1099
でいけました。jndi.properties に設定すればいけます。けどiiopのほうはだめでした。??

感想:それにしてもRMIのlookupってえらい遅いですね。。。
UDPの100倍くらい遅い印象。。。ていったら大げさですかね。
1

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