スレッド・コンテキスト・サービス・インスタンスの構成

管理対象スレッド・コンテキストをキャプチャーし、任意のスレッドの指定されたインターフェース・メソッドの呼び出しに適用するように、 ContextService インスタンスを構成することができます。

このタスクについて

Java™ EE アプリケーションでのベスト・プラクティスは、アプリケーション独自のスレッドを直接管理するのを避けることです。そのため、 ContextService により、管理対象スレッドや非管理対象スレッドに以前にキャプチャーされたスレッド・コンテキストを確立して、 設定されているスレッド・コンテキストをオーバーレイする方法が提供されます。

デフォルトのスレッド・コンテキスト・サービス・インスタンス (DefaultContextService) はサーバーによって作成され、少なくとも classloaderContextjeeMetadataContext および 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>
  • classloaderContextsecurityContext を持つスレッド・コンテキスト・サービス:
    <contextService jndiName="concurrent/threadContextSvc2">
    	<classloaderContext/>
    	<securityContext/>
    </securityContext/>
  • jeeMetadataContextthreadContextSvc1 から継承し、 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);
    ...

トピックのタイプを示すアイコン タスク・トピック

ファイル名: twlp_config_contextservice.html