Session Beanは呼び出し元のアプリケーションからの要求を同期的に処理します。ローカル用インタフェース(@Localアノテーションを定義したインタフェースなど)を使用する場合には、同一のサーバーインスタンスに配備されたアプリケーションからのみ呼び出すことができます。また、リモート用インタフェース(@Remoteアノテーションを定義したインタフェースなど)を使用する場合には、同一のサーバーインスタンスに配備されたアプリケーションだけでなく、IIOP通信を経由してリモートマシンからEnterprise JavaBeansを呼び出すことができます。この場合、以下の呼び出し元の形態により利用できる機能や呼び出し元の環境設定に違いがあります。
同一のサーバーインスタンス/同一の配備モジュール内のアプリケーション
同一のサーバーインスタンス/別の配備モジュール内のアプリケーション
別のサーバーインスタンスのアプリケーション
Java EEアプリケーションクライアント
Java SEスタンドアロンアプリケーション
利用できる機能
以下の表はそれぞれの呼び出し元の形態で利用できる機能の差異を示しています。○が利用可能な機能です。
機能 | 同一のサーバーインスタンス/同一の配備モジュール内のアプリケーション | 同一のサーバーインスタンス/別の配備モジュール内のアプリケーション | 別のサーバーインスタンスのアプリケーション | Java EEアプリケーションクライアント | Java SEスタンドアロンアプリケーション |
---|---|---|---|---|---|
動的スタブ | ○ | ○ | ○ | ○ | ○ |
ローカル呼び出し | ○ | - | - | - | - |
リモート用インタフェース利用時の参照渡し | ○ | - | - | - | - |
以下にそれぞれの呼び出し元の形態で利用できる機能について説明します。
動的スタブ
リモート用インタフェースを使用してEnterprise JavaBeansを呼び出す場合、IIOP通信処理を隠ぺいするためにスタブという中継クラスを経由して呼び出されます。このスタブはインタフェースの情報を元に動的に生成されるため動的スタブと呼びます。(J2EE機能ではスタブは配備時に生成されていたため、スタブを含むクライアント配布物を呼び出し元のクラスパスに設定する必要がありました。)このため、呼び出し元はインタフェースのみ参照できれば、Enterprise JavaBeansを呼び出すことができます。
IIOP通信についての詳細は、「2.12 ORB(Object Request Broker)/RMI-IIOP」を参照してください。
ローカル呼び出し
同一のサーバーインスタンス/同一の配備モジュール内でリモート用インタフェースを使用してEnterprise JavaBeansを呼び出す場合、スタブが自動的にIIOP通信を経由せずにEnterprise JavaBeansを呼び出します。これをローカル呼び出しと呼びます。
リモート用インタフェース利用時の参照渡し
メソッド呼び出し時の引数や戻り値の受け渡し方には"値渡し"と"参照渡し"があります。
値渡しの場合、呼び出し元には引数や戻り値のコピーが渡されます。このため、呼び出し元で値を変更しても、呼び出し先に影響を与えません。
参照渡しの場合、呼び出し元には引数や戻り値の参照が渡されます。このため、呼び出し元で値を変更すると、呼び出し先の状態も変更されます。
IIOP通信でインターネットを経由してメソッドを呼び出した場合、異なるJava VM間の呼び出しとなりますので必ず値渡しになります。このため、汎用性を考慮してリモート用インタフェースを利用した場合にはデフォルトで値渡しで動作します。しかし、同一のサーバーインスタンス内でリモート用インタフェースを使用してEnterprise JavaBeansを呼び出す場合には値のコピーを生成しない参照渡しの方が性能が良いため、参照渡しに変更することができます。
参照渡しに変更するには、呼び出し先のEnterprise JavaBeansのInterstage EJB application deployment descriptor(glassfish-ejb-jar.xml)ファイルに、<pass-by-reference>タグを定義して"true"を指定します。
Interstage EJB application deployment descriptorファイルの詳細は、「3.2.1 Interstage deployment descriptor」を参照してください。
IIOP通信によるリモートアクセスを行う場合の環境設定
EJBアプリケーションでは、IIOP通信によるリモートアクセスにおいて、個別のスレッドプールが定義されている場合はそのスレッドプールが使用され、個別のスレッドプールが定義されていない場合は、用意されているデフォルトスレッドプールが使用されます。
デフォルトスレッドプールは、以下の機能でも使用されるため、EJBアプリケーションへの要求が多くなるとスレッドの空き待ちが発生し、遅延が発生する場合や応答がなくなる場合があります。
EJBタイマーサービスによるコールバックメソッドの実行
Enterprise Beanインスタンスのキャッシングによるpassivate処理の実行
Enterprise Beanインスタンスのプーリングによるプールの縮小や拡張処理の実行
スレッドプールIDを定義していないリソースアダプタのWorkの実行
別プロセスのEJBアプリケーションを呼び出した場合のリクエスト受信処理
IIOP通信によるリモートアクセスが行われるEJBアプリケーションについては、必ずデフォルトスレッドプールとは別のスレッドプールを作成し、「Enterprise Beanごとのスレッドプール設定」を行ってください。
各スレッドプールの利用イメージについては、「6.11.1 ORB」に記載されている通信データの流れを示した図を参照してください。
なお、デフォルトスレッドプールは、インストール直後の値が「thread-pool-1」になっています。このスレッドプールは削除しないでください。
呼び出し元の環境設定
以下の表はそれぞれの呼び出し元の形態で環境設定が必要なものを示しています。○が環境設定が必要なものです。△は環境設定が必要な場合があるものです。
環境設定項目 | 同一のサーバーインスタンス/同一の配備モジュール内のアプリケーション | 同一のサーバーインスタンス/別の配備モジュール内のアプリケーション | 別のサーバーインスタンスのアプリケーション | Java EEアプリケーションクライアント | Java SEスタンドアロンアプリケーション |
---|---|---|---|---|---|
クライアントスタブJARファイル | - | - | - | ○ | - |
JNDIの環境変数の設定 | - | - | - | - | ○ |
リモート用インタフェースの設定 | - | ○ | ○ | △ | ○ |
接続先の設定 | - | - | ○ | ○ | ○ |
以下にそれぞれの環境設定ついて説明します。
クライアントスタブJARファイル
Java EEアプリケーションクライアントを使用する場合、アプリケーションクライアント(client-jarファイル)を含むモジュールを配備し、その配備したモジュールに対してasadminコマンドのget-client-stubsサブコマンドでクライアントスタブJARファイルをダウンロードして利用します。Java EEアプリケーションクライアント以外を使用する場合には、クライアントスタブJARファイルは不要です。
JNDIの環境変数の設定
Java SEスタンドアロンアプリケーションでEnterprise JavaBeansを呼び出す場合、JNDIを使用するためJNDIの環境変数の設定が必要です。サーバーインスタンスやJava EEアプリケーションクライアントを運用するアプリケーションクライアントコンテナではJNDIの環境設定が自動的に行われているため設定は不要です。
リモート用インタフェースの設定
リモート用インタフェースでEnterprise JavaBeansを呼び出す場合、動的スタブで呼び出されるためリモート用インタフェースがアプリケーションから参照できれば呼び出すことができます。
Enterprise JavaBeansのクラス(ejb-jarファイルに含まれるクラス)は同一の配備モジュール内で参照できるApplicationクラスローダでロードされるため、同一のサーバーインスタンス/同一の配備モジュール内のアプリケーションであればリモートインタフェースをクラスパスなどに設定する必要はありません。
配備モジュールからクライアントスタブJARファイルをダウンロードして運用するJava EEアプリケーションクライアントの場合、EJBモジュール(ejb-jarファイル)とアプリケーションクライアント(client-jarファイル)を含むエンタープライズアプリケーション(earファイル)に対してクライアントスタブJARファイルをダウンロードすると配備モジュール内にEnterprise JavaBeansが含まれているためクラスパスなどの設定は不要です。
上記以外の同一の配備モジュール以外から呼び出す場合には、呼び出し元のアプリケーションが参照できるようにリモート用インタフェースを設定してください。設定方法は「2.22 クラスローダ」を参照してください。
注意
EJB 3.x以降の場合は、呼び出し先のリモート用インタフェースを呼び出し元のアプリケーションに同梱してください。
呼び出し先のリモート用インタフェースまたはリモート用インタフェースを含むjarファイルを以下に指定しないでください。
共通ディレクトリ
クラスパスのサフィックス
接続先の設定
サーバーインスタンスで運用されているアプリケーションからリモート用インタフェースでEnterprise JavaBeansを呼び出す場合、デフォルトでは同一サーバーインスタンス上のEnterprise JavaBeansが自動的に呼びされます。このため、接続先のホスト名とポート番号の設定は不要です。
別のサーバーインスタンスのアプリケーションからEnterprise JavaBeansを呼び出す場合、他ネーミングサービス連携機能を使用して接続先を設定します。詳細は「2.14 JNDI」を参照してください。
Java EEアプリケーションクライアントの場合にはglassfish-acc.xmlファイルにエンドポイントを指定し、Java SEスタンドアロンアプリケーションの場合にはJava VMのシステムプロパティに"com.sun.appserv.iiop.endpoints"を指定し、接続先を設定します。詳細は、「4.18.3 クライアント(呼び出し元)の設定」を参照してください。
スレッドプールは、asadminコマンドを使用して作成できます。詳細は、以下を参照してください。
スレッドプールの設定値は、asadminコマンドを使用して変更できます。詳細は、以下を参照してください。
作成したスレッドプールを、使用するEJBアプリケーションのInterstage deployment descriptorで指定します。詳細は、以下を参照してください。
「3.2.1.3 Interstage EJB application deployment descriptor (glassfish-ejb-jar.xml)」の<use-thread-pool-id>タグ