- jboss:service=Naming
JNDIサーバ。実装はorg.jboss.naming.NamingService。サービスが開始するとクラスパスからjndi.propertiesを探し出して読み込み、システムプロパティにセットする。conf/jndi.propertiesを読み込むことを期待されているが、先に変なjndi.propertiesを読んでしまうとまずいことになる(サードパーティのjarとかに入ってないとも限らない)。InitialContextまわりで変な動作が起こるようなら、server.logで
2006-02-27 01:49:13,609 DEBUG [org.jboss.naming.NamingService] InitialContext Environment: 2006-02-27 01:49:13,609 DEBUG [org.jboss.naming.NamingService] key=java.naming.factory.initial, value=org.jnp.interfaces.NamingContextFactory 2006-02-27 01:49:13,609 DEBUG [org.jboss.naming.NamingService] key=java.naming.factory.url.pkgs, value=org.jboss.naming:org.jnp.interfaces:org.jboss.naming:org.jnp.interfaces
と出力されているログ(=デフォルトのInitialContext環境変数)をチェックしてconf/jndi.propertiesと比較してみよう。
さて、JNDIってあんまり勉強したりする機会とか無いと思うんですがどうですか?
ググってみるとうってつけのがありました
IBM Developer 日本語版 : IBM Developer: 開発者、技術者、SE、ITスペシャリストのための技術情報 - Japan
第1のポイントは
JNDI API | Naming Manager | JNDI SPI | サービスプロバイダ(DNS/RMIレジストリ/ etc...)
という階層構造になっていること。
第2にクライアントは、InitialContextをnewするときの「INITIAL_CONTEXT_FACTORY」「PROVIDER_URL」で使用するサービスプロバイダを指定する、ということ。DNSなら「com.sun.jndi.dns.DnsContextFactory」と「dns://....」みたいにね。
さて、JBossではjboss:service=NamingはJNP JNDIサーバであるとされており、サーバ実装はorg.jnp.server.Mainに委譲されている。InitialContextは「org.jnp.interfaces.NamingContextFactory」と「jnp://....」の組み合わせでアクセスする。
となるとサービスプロバイダとしてのJNPって何ですかっていう疑問が出てくるわけだが、JNPについてのドキュメントがどーも見つからない。。。と思ったらやっとのことで
Web上でみれるのはこれ
http://www.opensource.apple.com/darwinsource/Current/JBoss-737/jboss-all/naming/src/docs/
ですね。
これによると、JNPはJava Naming Providerという直球の名前でした。普通の名前解決によるオブジェクトの提供と、RMIをサポートしているようだ。まあJ2EEで必要なものはそろっているということでしょうか。GPLなんだ、フーン*2。
(追記:JNPの仕様書は無いそうです。http://www.jboss.com/index.html?module=bb&op=viewtopic&t=79931)
jboss:service=Namingに話を戻すと、ルックアップ時に見る1099以外にも1098というポートを使うんですが、何だろう、というとサーバがorg.jnp.server.NamingServerオブジェクトをexportするポートです。JNDIのbindやlookupは最終的にはこいつがやってくれます。
それからCallByValueという属性があったけど、これは同一VMでのlookupで値渡し(=シリアライズが発生)するかどうかというフラグです。当然falseのほうが速いからいいんだけど、デフォルトでtrueのバージョンもあるので注意*3。