非同期 Bean は、非同期 Bean クリエーターの J2EE コンテキストを使用して、Java 2 Platform Enterprise
(J2EE) アプリケーションが非同期で実行できる Java オブジェクトまたはエンタープライズ Bean です。
非同期 Bean は、J2EE プログラムが操作を並列タスクに分解できるようにすることにより、パフォーマンスを向上させることができます。
非同期 Bean により、
ステートフルかつアクティブな J2EE アプリケーションを構築することができます。
これらのアプリケーションは、J2EE があらかじめ割り当てていなかったアプリケーション・スペースのセグメントを割り当てます。
(つまり、この拡張アプリケーションでは、アプリケーションのスレッド化、
サーバー・アプリケーション内のアクティブ・エージェント、あるいは分散モニター機能が必要となります。)
非同期 Bean は、クリエーター J2EE コンポーネントの J2EE セキュリティー・コンテキストを使用して実行されます。 この Bean は、他の J2EE コンテキストのコピーとともに実行することもできます。
- 国際化対応コンテキスト
- J2EE 1.4 アプリケーションではサポートされていない、J2EE 1.3
アプリケーションでは非推奨のアプリケーション・プロファイル。
- 作業域
非同期 Bean インターフェース
以下の 4 つのタイプの非同期 Bean があります。
- 作業オブジェクト
- 2 つ作業インターフェースがあり、どちらも基本的には同じ目標を達成します。
既存の非同期 Bean の作業インターフェースは com.ibm.websphere.asynchbeans.Work で、CommonJ の作業インターフェースは commonj.work.Work です。作業オブジェクトは、作業マネージャーの startWork メソッドまたは schedule メソッド (既存の非同期 Bean の場合は startWork、CommonJ の場合は schedule) を使用して、その呼び出し元と並列に実行します。アプリケーションは、複数のコード・ブロックを非同期で実行する作業オブジェクトをインプリメントします。
作業インターフェースについて詳しくは、API 文書を参照してください。
- タイマー・リスナー
- このインターフェースは、commonj¥timers¥TimerListener インターフェースをインプリメントするオブジェクトです。
タイマー・リスナーは、高速の一過性タイマーの有効期限が切れたときに呼び出されます。TimerListener
インターフェースについて詳しくは、API 文書を参照してください。
- アラーム・リスナー
- アラーム・リスナーは、com.ibm.websphere.asynchbeans.AlarmListener
インターフェースをインプリメントするオブジェクトです。 アラーム・リスナーは、高速の一過性アラームの有効期限が切れるときに
呼び出されます。
AlarmListener インターフェースについて詳しくは、API
文書を参照してください。
- イベント・リスナー
- イベント・リスナーは、あらゆるインターフェースもインプリメントすることができます。 イベント・リスナーは、単一の Java 仮想マシン (JVM) 内にある非同期イベント用の軽量で非同期の通知メカニズムです。
通常、イベント・リスナーを使用すると、単一アプリケーション内の J2EE コンポーネントが、さまざまな非同期イベントに関して互いに通知し合うことができます。
サポート・インターフェース
- 作業マネージャー
- 作業マネージャーは、管理者が J2EE アプリケーション用に作成するスレッド・プールです。
管理者は、このスレッド・プールのプロパティー、および非同期 Bean がどの J2EE コンテキストを継承するかを決定するためのポリシーを指定します。
- CommonJ 作業マネージャー
- CommonJ 作業マネージャーは、作業マネージャーに類似しています。両者の違いは、CommonJ 作業マネージャーには、非同期 Bean 作業マネージャーのメソッドのサブセットが含まれていることです。CommonJ 作業マネージャーは J2EE 1.4 環境で動作しますが、作業マネージャーのそれぞれの JNDI ルックアップは WorkManager の新規インスタンスを戻しません。有効範囲内にある作業マネージャーのすべての JNDI ルックアップは、同一のインスタンスを持ちます。
- タイマー・マネージャー
- タイマー・マネージャーは、commonj.timers.TimerManager インターフェースをインプリメントします。このインターフェースを使用すると、サーブレット、EJB アプリケーション、および JCA リソース・アダプターを含む、J2EE アプリケーションで、将来のタイマー通知をスケジュールし、タイマー通知を受信することができます。
J2SE の java.util.Timer クラスの使用は、管理対象環境には不適切であるため、Application Server 仕様のタイマー・マネージャーは、アプリケーション・サーバーがサポートするその代替手段を提供しています。
- イベント・ソース
- イベント・ソースは、com.ibm.websphere.asynchbeans.EventSource インターフェースをインプリメントします。 イベント・ソースは、単一 JVM 内の汎用のタイプ・セーフ非同期通知サーバーをサポートする
システム提供オブジェクトです。 このイベント・ソースを使用すると、イベント・リスナー・オブジェクト (あらゆるインターフェースをインプリメント可能) を登録できるようになります。EventSource インターフェースについて詳しくは、API 文書を参照してください。
- イベント・ソース・イベント
- すべてのイベント・ソースは、listener count changed などの独自のイベントを生成できます。アプリケーションは、com.ibm.websphere.asynchbeans.EventSourceEvents クラスをインプリメントする
イベント・リスナー・オブジェクトを登録できます。このアクションにより、アプリケーションは、リスナーの追加や除去、またはリスナーによる予期しない例外のスローなどのイベントをキャッチすることが可能となります。EventSourceEvents
クラスについて詳しくは、API 文書を参照してください。
追加インターフェース (アラームおよびサブシステム・モニターを含む) については、非同期有効範囲の開発トピックで説明します。このトピックでは、非同期 Bean の拡張アプリケーションをいくつか説明します。
トランザクション
すべての非同期 Bean メソッドは、独自のトランザクションを
使用して呼び出されます。これは、一般的な Enterprise Bean のコンテナー管理トランザクションと同様です。この状態は、Enterprise Java
Beans (EJB) メソッドが TX_NOT_SUPPORTED で呼び出されるときの状態とほとんど同じです。
ランタイムは、メソッドを呼び出す前にローカル・トランザクションを開始します。
非同期 Bean メソッドは、このトランザクションを呼び出し側の J2EE コンポーネントに対して行うことが可能な場合、独自のグローバル・トランザクションを自由に開始できます。
例えば、Enterprise Bean でコンポーネントを作成する場合、その非同期 Bean を作成するメソッドは、TX_BEAN_MANAGED である必要があります。
例えば、非同期 Bean 内から
Entity Bean を呼び出す場合は、現行のスレッドでグローバル・トランザクション・コンテキストが使用可能にされている必要があります。非同期 Bean オブジェクトは、ローカル・トランザクション・コンテキストを開始するので、メソッドが TX_REQUIRES またはそれと同等のものとしてマークされている Session Bean に、
すべての Entity Bean ロジックをカプセル化することができます。このプロセスにより、
グローバル・トランザクション・コンテキストが確立され、
そこから 1 つ以上の Entity Bean のメソッドにアクセスできます。
非同期 Bean メソッドが例外をスローすると、すべてのローカル・トランザクションがロールバックされます。 メソッドが正常に戻された場合、完了していないすべてのローカル・トランザクションは、その Bean 用に構成された未解決アクション・ポリシーに従って完了します。 EJB メソッドは、独自の
デプロイメント記述子を使用して、このポリシーを構成できます。非同期 Bean メソッドが独自のグローバル・トランザクションを開始してこのグローバル・トランザクションを
コミットしない場合、コミットされなかったトランザクションは、メソッドが戻されるときに
ロールバックされます。
J2EE コンポーネントのメタデータへのアクセス
非同期 Bean が Session Bean などの J2EE コンポーネントの場合は、メソッドが呼び出されるときに、そのコンポーネント独自のメタデータがアクティブになります。
非同期 Bean がシンプルな Java オブジェクトの場合は、その Bean で生成コンポーネントの J2EE コンポーネント・メタデータを使用できます。 非同期 Bean は、そのクリエーターと同様、java:comp ネーム・スペースを検索できます。
この検索により、非同期 Bean は、他の J2EE コンポーネントと同様に、接続ファクトリーおよび Enterprise Bean にアクセスすることが可能となります。
また、生成コンポーネントの環境プロパティーも、非同期 Bean で使用できます。
java:comp ネーム・スペースは、生成コンポーネントで使用可能なものと同一であり、同じ制限が適用されます。 例えば、Enterprise Bean またはサーブレットに java:comp/env/ejb/MyEJB の EJB 参照がある場合、この EJB 参照は、非同期 Bean で使用することができます。
さらに、すべての接続ファクトリーは、生成コンポーネントと同じリソース共有有効範囲を使用します。
接続管理
非同期 Bean メソッドは、このメソッドが作成する J2EE コンポーネントが java:comp リソース参照を
使用して取得した接続を使用することができます (リソース参照について詳しくは、参照を参照してください)。 ただし、Bean メソッドは、get、use、または close パターンを使用してそれらの接続にアクセスする必要があります。 接続は、非同期 Bean 上のメソッドの呼び出し間ではキャッシュされません。 接続ファクトリーまたはデータ・ソースはキャッシュすることができますが、接続はメソッド呼び出しごとに検索および使用され、その後クローズされる必要があります。
非同期 Bean メソッドはグローバルな Java Naming and Directory Interface (JNDI) 名を使用して接続ファクトリーを検索できますが、以下の理由により、この方法はお勧めしません。
- JNDI 名がアプリケーション内にハードコーディングされている (例えば、プロパティーまたは
ストリング・リテラルとして)。
- 接続ファクトリーは、共用有効範囲を指定する方法がないため共用されない。
非同期 Bean メソッドから接続にアクセスする正しい方法および誤った方法の両方が示されているコード例は、トピック例: 非同期 Bean 接続管理を参照してください。
非同期 Bean の据え置き開始
非同期 Bean は、J2EE サービス・コンテキスト情報のシリアライゼーションを許可することによって、据え置き開始をサポートしています。
WorkManager インターフェースでの
WorkWithExecutionContext createWorkWithExecutionContext(Work r) メソッドは、WorkManager 上で使用可能になっている J2EE サービス・コンテキストのスナップショットを作成します。
その結果の
WorkWithExecutionContext オブジェクトをシリアライズして、データベースまたはファイルに保管することができます。
これは、現行のセキュリティー ID やロケールなどの J2EE サービス・コンテキストを保管後にシリアライズを解除し、
このコンテキスト内で何らかの作業を実行する必要がある場合に役立ちます。
WorkWithExecutionContext
オブジェクトは、WorkManager インターフェースで startWork() および doWork() メソッドを使用して実行できます。
すべての WorkWithExecutionContext オブジェクトは、そのオブジェクトをシリアライズしたのと同じアプリケーションによって、デシリアライズする必要があります。
内部に含まれるオブジェクトのシリアライズを Java で正常に解除するには、すべての EJB とクラスが存在している必要があります。
据え置き開始およびセキュリティー
非同期 Bean セキュリティー・サービス・コンテキストは、Common Secure Interoperability Version 2 (CSIv2) ID アサーションを使用可能にすることが必要である場合があります。
識別表明は、
WorkWithExecutionContext オブジェクトが、デシリアライズされ、Java Authentication and Authorization Service (JAAS)
サブジェクト ID 信任状割り当てに対して実行される場合に必要となります。
WorkWithExecutionContext オブジェクトを使用する際に ID アサーションを使用可能にする必要がある場合は、以下のトピックを参照してください。
この製品のさまざまなバージョンから WorkWithExecutionContext オブジェクトと対話することに関する問題もあります。
非同期 Bean との相互強調処理を参照してください。