Show Table of Contents
8.2. JBoss Naming Service アーキテクチャー
JBoss Naming Service (JBossNS) アーキテクチャーは、
javax.naming.Context
インターフェースのJava ソケット/RIM ベース実装となっています。JBossNS はリモートからアクセス可能なクライアント/サーバー実装で、この実装は最適化されており、ソケットを必要とせずに、JBossNS サーバーが稼働している同じVM からアクセスすることができます。グローバルシングルトンとして利用可能なオブジェクト参照を使うことで同じVM アクセスが発生します。図8.1「JBoss Naming Service アーキテクチャーで主要なコンポーネント」 では、JBossNS 実装およびその関係において重要となるキーの一部を図解しています。

図8.1 JBoss Naming Service アーキテクチャーで主要なコンポーネント
まず、
NamingService
MBeanから見ていきます。NamingService
MBean は、JNDI ネーミングサービスを提供しており、J2EE テクノロジーコンポーネントで広範利用されている主要サービスです。NamingService
の設定可能な属性を以下に示します。
- Port:
NamingService
のポートをリッスンする jnp プロトコル。指定がない場合は、RMI レジストリのデフォルトポートと同じ 1099 がデフォルトになります。 - RmiPort: RMI ネーミング実装がエクスポートされるRMI ポート。指定がない場合、デフォルトは0で、利用可能なポートはどれでも利用するという意味です。
- BindAddress:
NamingService
がリッスンする特定のアドレス。ソケットアドレスの1つに関する接続リクエストしか受け付けないjava.net.ServerSocket
のマルチホームホスト上で利用可能です。 - RmiBindAddress:
NamingService
の RIM サーバー部分がリッスンする特定のアドレスです。ソケットアドレスの1つに関する接続リクエストしか受け付けないjava.net.ServerSocket
のマルチホームホスト上で利用可能です。指定されていず、BindAddress
が指定されている場合、RmiBindAddress
はBindAddress
値にデフォルト設定されます。 - Backlog: 受信接続の表示 (接続要求) に対する最大長は
backlog
パラメーターに設定します。キューがフルの状態で接続表示を受けると、その接続は拒否されます。 - clientSocketFactory: オプションのカスタム
java.rmi.server.RMIClientSocketFactory
実装クラス名。指定されていない場合、デフォルトのRMIClientSocketFactory
が利用されます。 - ServerSocketFactory: オプションのカスタム
java.rmi.server.RMIServerSocketFactory
実装名。指定されていない場合、デフォルトのRMIServerSocketFactory
が利用されます。 - JNPServerSocketFactory: オプションのカスタム
javax.net.ServerSocketFactory
実装クラス名。JBoss Naming ServiceNaming
インターフェースのダウンロードをブートストラップするために利用するServerSocket
のファクトリ。指定されていない場合、javax.net.ServerSocketFactory.getDefault()
メソッド値が利用されます。
java:comp
コンテキストへアクセスするスレッドのコンテキストクラスローダーに基づき、このコンテキストへのアクセスが隔離されるように、NamingService
も java:comp
を作成します。こうすることで J2EE 仕様で必要なアプリケーションコンポーネントのプライベートENC を提供します。このような隔離は、javax.naming.Reference
をorg.jboss.naming.ENCFactory
を使用するコンテキストにjavax.naming.ObjectFactory
としてバインドすることで行うことができます。クライアントがjava:comp
やサブコンテキストのルックアップを行う場合、ENCFactory
はスレッドコンテキストClassLoader
をチェックし、ClassLoader
をキーとして使いマップ内でルックアップを実行します。
クラスローダーインスタンスに対しコンテキストインスタンスが存在しない場合、
ENCFactory
マップ内にコンテキストインスタンスが作成されクラスローダーと紐付けられます。そのため、実行中のコンポーネントスレッドに紐付いた固有のClassLoader
を受け取る各コンポーネントにより、正確にアプリケーションコンポーネントのENC を隔離されるか左右されます。
NamingService
はその機能をorg.jnp.server.Main
MBean に委譲します。MBean が重複する理由には、JBoss Naming Service が最初はスタンドアローンの JNDI 実装として開始され、そのまま実行することができるという点が挙げられます。NamingService
MBean はMain
インスタンスを JBoss サーバーに埋め込むため、JBossサーバーと同じ VM とJNDI を利用しても、ソケットのオーバーヘッドは発生しません。実際は、NamingService の設定可能な属性は、JBoss Naming Service Main
MBean の設定可能な属性なのです。NamingService
MBean 上の属性設定は、単に NamingService
内のMain
MBean にある該当属性を設定するだけです。NamingService
が起動すると、包含するMain
MBean を開始し JNDI のネーミングサービスを有効にします。
さらに、
NamingService
は、JMX detyped 呼出し操作によりNaming
インターフェースの操作を公開します。これにより、任意のプロトコルに対する JMX アダプタを経由でネーミングサービスにアクセスできるようになります。HTTP が呼出し操作を使ってネーミングサービスにアクセスする方法について、一例を本章で後述します。
Main
MBeanが開始されると、以下のタスクを実行します。
org.jnp.naming.NamingService
インスタンスをインスタンス化し、これをローカルのVM サーバーインスタンスとして設定します。これは、JBoss サーバーのVM内に作成されたorg.jnp.interfaces.NamingContext
インスタンスのいずれかが使用しTCP/IP でのRMI 呼出しが回避されるようにします。- 設定された
RmiPort
、ClientSocketFactory
、ServerSocketFactory
属性を使って、NamingServer
インスタンスのorg.jnp.naming.interfaces.Naming
RMI インターフェースをエクスポートします。 BindAddress
とPort
属性により与えられたインターフェースをリッスンするソケットを作成します。- ソケットで接続を受け取るスレッドを生成します。