conf/jboss-service.xmlその6

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についてのドキュメントがどーも見つからない。。。と思ったらやっとのことで/naming/src/docs/index.htmlにお目当てのものを発見*1
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

*1:しかしここのリンクにあるhttp://www.dreambean.com/はアクセス不能。JNPのオリジネイターのようだが。。。

*2:JBossのorg.jnpのソースはLGPL。作者RickardがJBossに入り、LGPLに変えたんですかね。RickardはもうJBossを離れてます

*3:当時パフォーマンステストをやってたときに気づいてあせった記憶がある。まあたいした違いはなかったけど