8.2. JBoss Naming Service アーキテクチャー

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

図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 が指定されている場合、RmiBindAddressBindAddress 値にデフォルト設定されます。
  • Backlog: 受信接続の表示 (接続要求) に対する最大長はbacklog パラメーターに設定します。キューがフルの状態で接続表示を受けると、その接続は拒否されます。
  • clientSocketFactory: オプションのカスタム java.rmi.server.RMIClientSocketFactory 実装クラス名。指定されていない場合、デフォルトのRMIClientSocketFactory が利用されます。
  • ServerSocketFactory: オプションのカスタム java.rmi.server.RMIServerSocketFactory 実装名。指定されていない場合、デフォルトのRMIServerSocketFactory が利用されます。
  • JNPServerSocketFactory: オプションのカスタム javax.net.ServerSocketFactory 実装クラス名。JBoss Naming Service Naming インターフェースのダウンロードをブートストラップするために利用する ServerSocketのファクトリ。指定されていない場合、javax.net.ServerSocketFactory.getDefault() メソッド値が利用されます。
java:compコンテキストへアクセスするスレッドのコンテキストクラスローダーに基づき、このコンテキストへのアクセスが隔離されるように、NamingServicejava:compを作成します。こうすることで J2EE 仕様で必要なアプリケーションコンポーネントのプライベートENC を提供します。このような隔離は、javax.naming.Referenceorg.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 呼出しが回避されるようにします。
  • 設定されたRmiPortClientSocketFactoryServerSocketFactory 属性を使って、NamingServer インスタンスのorg.jnp.naming.interfaces.Naming RMI インターフェースをエクスポートします。
  • BindAddressPort 属性により与えられたインターフェースをリッスンするソケットを作成します。
  • ソケットで接続を受け取るスレッドを生成します。