Concurrency Utilities for Java EE

Concurrency Utilities for Java™ EE は、非同期プログラミング・モデルであり、これを使用することによって、並行して実行するようにタスクをサブミットまたはスケジュールしたり、Java EE コンテキストを継承するスレッドを作成したり、Java EE コンテキストを転送して非同期コールバックなどのインターフェースを呼び出したりできます。

Concurrency Utilities for Java EE は、Java EE プログラムによって操作を並列タスクに分解できるようにすることで、パフォーマンスを向上させることが可能です。

タスクをサブミットする Java EE コンポーネントの Java EE コンテキストを使用して、タスクを実行できます。これらのタスクは、以下のように他の Java EE コンテキストのコピーを使用して実行することもできます。
  • セキュリティー・コンテキスト
  • 国際化対応コンテキスト
  • 作業域コンテキスト

並行性インターフェース

Concurrency Utilities for Java EE は、主に以下に示す 4 つのタイプのリソースを提供します。これらはそれぞれ、JNDI 内で構成および提供できます。

管理対象 executor サービス
アプリケーションは、管理対象 executor を使用して、タスクを実行するためのリソースが使用可能になったときにスレッドとして実行開始できる (通常はプールから) 非同期タスクをサブミットできます。 タスクは、Callable または Runnable のインスタンスです。アプリケーションには future が指定され、アプリケーションは future からステータスを検査し、タスク完了の結果を取得または待機できます。 管理対象 executor は、タスクのグループ、またはグループ内の 1 つのタスクをサブミットし、完了を待機するインターフェースを含みます。タスクは、タスクを実行依頼するスレッドのコンテキストを継承します。
管理対象スケジュール executor サービス
アプリケーションは、管理対象スケジュール executor を使用して、特定の時点より後に実行を開始する非同期タスクをスケジュールに入れます。タスクは、Callable または Runnable のインスタンスです。管理対象スケジュール executor には、固定の間隔、またはカスタムのビジネス・ロジックに従って計算された間隔で、タスクの自動スケジュール変更を行うインターフェースが組み込まれています。タスクは、タスクをスケジュールに入れるスレッドのコンテキストを継承します。
管理対象スレッド・ファクトリー
アプリケーションは、管理対象スレッド・ファクトリーを使用して新規スレッドを構成し、これらのスレッドは、管理対象スレッド・ファクトリーを検索または注入したアプリケーション・コンポーネントのコンテキストを継承します。
コンテキスト・サービス
アプリケーションは、コンテキスト・サービスを使用してコンテキスト・プロキシーを構成します。コンテキスト・プロキシーにより、1 つ以上のプロキシー・インターフェースの呼び出しが、プロキシーを作成したスレッドのコンテキストを継承できます。

トランザクション

サブミットされた、またはスケジュールに入れられたタスク、管理対象スレッド・ファクトリー・スレッド、およびコンテキスト・プロキシー操作はすべて、以前にスレッド上で実行されていたトランザクションを中断して呼び出されます。これは、標準的なエンタープライズ Bean のコンテナー管理トランザクションと同様です。この状態は、エンタープライズ JavaBeans (EJB) メソッドが TX_NOT_SUPPORTED を指定して呼び出された場合と似ています。ランタイムは、メソッドを呼び出す前にローカル・トランザクション内包を開始します。 呼び出し元 Java EE コンポーネントでこのトランザクションが実行可能ならば、タスクは独自のグローバル・トランザクションを開始できます。USE_TRANSACTION_OF_EXECUTION_THREAD の値を指定して TRANSACTION 実行プロパティーを指定することによって、コンテキスト・プロキシーのこの動作をオーバーライドできます。このプロパティーにより、プロキシー・メソッド内で実行されたトランザクション操作を呼び出し側スレッドのトランザクションとともにコミットおよびロールバックできるように、トランザクションを実行スレッドに残すことができます。

例えば、タスク内からエンティティー Bean を呼び出す場合は、現行のスレッドでグローバル・トランザクション・コンテキストが使用可能になっている必要があります。タスクは、ローカル・トランザクション・コンテキストを開始するので、メソッドが TX_REQUIRES またはそれと同等のものとしてマークされているセッション Bean に、 すべてのエンティティー Bean ロジックをカプセル化することができます。このプロセスにより、 グローバル・トランザクション・コンテキストが確立され、 そこから 1 つ以上の Entity Bean のメソッドにアクセスできます。

Java EE コンポーネント・メタデータへのアクセス

タスクがセッション Bean などの Java EE コンポーネントの場合は、メソッドが呼び出されるときに、そのコンポーネント独自のメタデータがアクティブになります。タスクが単純な Java オブジェクトの場合は、その Bean で生成コンポーネントの Java EE コンポーネント・メタデータを使用できます。サブミット元スレッドと同様に、タスクは java:compjava:module、および java:app の名前空間を検索できます。 この検索により、他の Java EE コンポーネントと同様に、データ・ソース、接続ファクトリー、エンタープライズ Bean などのリソースに Bean がアクセスすることが可能となります。 また、生成コンポーネントの環境プロパティーも、タスクで使用できます。

java:comp 名前空間は、生成コンポーネントで使用可能なものと同一であり、同じ制限が適用されます。例えば、エンタープライズ Bean またはサーブレットに java:comp/env/ejb/MyEJB の EJB 参照がある場合、この EJB 参照はタスクで使用することができます。

接続管理

タスクは、その生成 Java EE コンポーネントが java:comp リソース参照を使用して取得したデータ・ソースおよび接続ファクトリーを使用できます。 (リソース参照について詳しくは、『参照』トピックを参照してください。) ただし、Bean メソッドは、get、use、または close パターンを使用してそれらの接続にアクセスする必要があります。非同期タスク上のメソッドの呼び出し間では、接続のキャッシュは行われません。接続ファクトリーまたはデータ・ソースをキャッシュすることはできますが、接続はメソッド呼び出しごとに取り出されて使用され、そして閉じられる必要があります。 タスク・メソッドはグローバルな Java Naming and Directory Interface (JNDI) 名を使用して接続ファクトリーとデータ・ソースを検索できますが、以下の理由のため、この方法は推奨されません。

  • JNDI 名がアプリケーション内にハードコーディングされている (例えば、プロパティーまたはストリング・リテラルとして)。
  • 接続ファクトリーは、共有有効範囲を指定する方法がないため共有されない。

タスクから接続にアクセスする正しい方法および誤った方法の両方が示されているコード例については、『例: 並行性接続管理』トピックを参照してください。

コンテキスト・タスクの据え置き開始

Concurrency Utilities for Java EE は、Java EE スレッド・コンテキスト情報のシリアライゼーションを許可することによって、据え置き開始をサポートしています。 ContextService.createContextualProxy メソッドに提供されるインスタンスがシリアライズ可能な場合、コンテキスト・プロキシーはシリアライズ可能です。この時点で、コンテキスト・サービスは WorkManager 上で有効になっている Java EE コンテキストのスナップショットを作成します。その結果のコンテキスト・プロキシーをシリアライズして、データベースまたはファイルに保管することができます。 これは、現行のセキュリティー ID やロケールなどの Java EE サービス・コンテキストを保管後にシリアライズを解除し、このコンテキスト内で何らかのタスクを実行する必要がある場合に役立ちます。コンテキスト・プロキシーのインターフェース・メソッドはすべて、前に取り込まれたスレッド・コンテキストを使用して実行されます。

すべてのコンテキスト・プロキシーは、そのプロキシーをシリアライズしたのと同じアプリケーションによってデシリアライズする必要があります。 内部に含まれるオブジェクトのシリアライズを Java が正常に解除するには、すべての EJB とクラスが存在している必要があります。

据え置き開始およびセキュリティー

セキュリティー・サービス・コンテキストを使用するには、Common Secure Interoperability Version 2 (CSIv2) ID アサーションを使用可能にする必要が生じる場合があります。 ID アサーションは、コンテキスト・プロキシーがデシリアライズされ、Java Authentication and Authorization Service (JAAS) サブジェクト ID クレデンシャル割り当てに対して実行される場合に必要となります。 コンテキスト・プロキシーを使用する際に ID アサーションを使用可能にする必要がある場合は、以下のトピックを参照してください。

  • Common Secure Interoperability バージョン 2 および Security Authentication Service 認証プロトコルの構成
  • ID アサーション

この製品のさまざまなバージョンにわたって、コンテキスト・プロキシーと対話することに関する制約もあります。

JPA 関連の制約

JPA 拡張パーシスタンス・コンテキスト内での非同期タスクの使用はサポートされていません。

JPA 拡張パーシスタンス・コンテキストは、Concurrency Utilities for Java EE' のスケジューリングおよびマルチスレッド化機能と矛盾するため、非同期タスクからはアクセスできません。

同様に、非同期タスクは、javax.persistence.EntityManager (またはサブクラス) をパラメーターとして受け取ることはできません。これは、EntityManager インスタンスがスレッド・セーフにされることがないためです。


トピックのタイプを示すアイコン 概念トピック



タイム・スタンプ・アイコン 最終更新: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=casb_concurrency
ファイル名:casb_concurrency.html