スレッド・コンテキスト・サービス・インスタンスの構成
管理対象スレッド・コンテキストをキャプチャーし、任意のスレッドの指定されたインターフェース・メソッドの呼び出しに適用するように、 ContextService インスタンスを構成することができます。
このタスクについて
デフォルトのスレッド・コンテキスト・サービス・インスタンス (DefaultContextService) はサーバーによって作成され、少なくとも classloaderContext、jeeMetadataContext および securityContext をキャプチャーして伝搬するよう構成されます。 以下のスレッド・コンテキスト・タイプを対象に含めるようにスレッド・コンテキスト伝搬を構成できます。
- classloaderContext
- タスクの実行依頼者のクラス・ローダーを、タスクが使用できるようにします。コンテキスト・クラス・ローダーがシリアライズされる場合、クラス・ローダーはアプリケーションからのスレッド・コンテキスト・クラス・ローダーでなければなりません。OSGi Web アプリケーション・バンドルのクラス・ローダー・シリアライゼーションは、現在サポートされていません。
- jeeMetadataContext
- タスクをサブミットしたアプリケーション・コンポーネントの名前空間を、タスクに対して使用可能にします。
- securityContext
- このタイプのスレッド・コンテキストを使用するには、 server.xml ファイルで appSecurity-2.0 フィーチャーを有効にする必要があります。 タスクの実行依頼者の呼び出し元サブジェクトおよび起動サブジェクトを、タスクに対して使用可能にします。これは、JAAS ログイン・モジュールを使用して、実行依頼者の WSPrincipal 資格情報を使用してログインすることによって行います。 セキュリティー・コンテキストにない、実行依頼者のサブジェクト内の情報に関する詳細については、 concurrent-1.0 フィーチャーの制約事項を参照してください。

- syncToOSThreadContext
- 作業単位の runAs サブジェクトの ID をオペレーティング・システム ID と同期します。

- zosWLMContext
- 作業の分類に使用されます。
手順
server.xml ファイルでスレッド・コンテキスト・サービスを有効にします。
スレッド・コンテキスト・サービスは、<concurrent-1.0> フィーチャーの下で使用可能です。
<featureManager>
<feature>concurrent-1.0</feature>
</featureManager>
例
server.xml ファイルのスレッド・コンテキスト・サービス・インスタンスを構成します。
- JNDI に名前 concurrent/threadContextSvc1 で登録され、
jeeMetadataContext のみをキャプチャーして伝搬するスレッド・コンテキスト・サービス:
<contextService id="threadContextSvc1" jndiName="concurrent/${id}"> <jeeMetadataContext/> </contextService>
- classloaderContext と securityContext を持つスレッド・コンテキスト・サービス:
<contextService jndiName="concurrent/threadContextSvc2"> <classloaderContext/> <securityContext/> </securityContext/>
- jeeMetadataContext を threadContextSvc1 から継承し、
securityContext を追加するスレッド・コンテキスト・サービス:
<contextService jndiName="concurrent/threadContextSvc3" baseContextRef="threadContextSvc1"> <securityContext> </contextService>
デフォルト・コンテキスト・サービスを検索する例:
ContextService threadContextSvc =
(ContextService) new InitialContext().lookup(
"java:comp/DefaultContextService");
myContextualAsyncCallback = threadContextSvc.createContextualProxy(
myAsyncCallback, MyAsyncCallback.class);
doSomethingAsync(arg1, arg2, myContextualAsyncCallback);
スレッド・コンテキスト・サービス・インスタンスを (@Resource を使用して) アプリケーション・コンポーネントに注入する例や、リソース環境参照 (resource-env-ref) で検索する例を以下に示します。
- @Resource を使用する例:
@Resource(lookup="concurrent/threadContextSvc1") ContextService threadContextSvc1; ... Callable<Integer> processSalesOrderCompletion = new Callable<Integer>() { public Integer call() throws Exception { DataSource ds = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/ds1"); ...update various database tables return isSuccessful; } }; // capture thread context of current application component execProps = Collections.singletonMap(ManagedTask.TRANSACTION, ManagedTask.USE_TRANSACTION_OF_EXECUTION_THREAD); processSalesOrderCompletion = (Callable<Boolean>) threadContextSvc1.createContextualProxy(processSaleCompletion, execProps, Callable.class); //later from a different application component tran.begin(); ... successful = processSalesOrderCompletion.call(); if (successful) tran.commit(); else tran.rollback();
- web.xml ファイル内の resource-env-ref を指定する例:
<resource-env-ref> <resource-env-ref-name>concurrent/threadContextSvc3</resource-env-ref-name> <resource-env-ref-type>javax.enterprise.concurrent.ContextService</resource- env-ref-type> </resource-env-ref>
- リソース環境参照を使用するルックアップ例:
ContextService threadContextSvc3 = (ContextService) new InitialContext().lookup("java:comp/env/concurrent/threadContextSvc3"); Runnable updateAndGetNextFromDatabase = threadContextSvc3.createContextualProxy (new Runnable() { public void run() { DataSource ds = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/ds1"); ... update the database and get next item to process } }, Runnable.class); barrier = new CyclicBarrier(3, updateAndGetNextFromDatabase); ...