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