[8.5.5.4 以降]

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

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

このタスクについて

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

手順

server.xml ファイルでスレッド・コンテキスト・サービスを有効にします。 スレッド・コンテキスト・サービスは、<concurrent-1.0> フィーチャーの下で使用可能です。
<featureManager>
	<feature>concurrent-1.0</feature>
</featureManager>

タスクの結果

デフォルトのスレッド・コンテキスト・サービス・インスタンス (DefaultContextService) はサーバーによって作成され、少なくとも classloaderContextjeeMetadataContext および securityContext をキャプチャーして伝搬するよう構成されます。 以下のスレッド・コンテキスト・タイプを対象に含めるようにスレッド・コンテキスト伝搬を構成できます。

classloaderContext
タスクの実行依頼者のスレッド・コンテキスト・クラス・ローダーを、タスクに対して使用可能にします。Liberty リポジトリー[8.5.5.4 以降]コンテキスト・クラス・ローダーがシリアライズされる場合、クラス・ローダーはアプリケーションからのスレッド・コンテキスト・クラス・ローダーでなければなりません。Web アプリケーション・バンドルのクラス・ローダー・シリアライゼーションは現在はサポートされていません。
jeeMetadataContext
タスクをサブミットしたアプリケーション・コンポーネントの名前空間を、タスクに対して使用可能にします。
securityContext
[8.5.5.4 以降] このタイプのスレッド・コンテキストを使用するには、 server.xml ファイルで appSecurity-2.0 フィーチャーを有効にする必要があります。 タスクの実行依頼者の呼び出し元サブジェクトおよび起動サブジェクトを、タスクに対して使用可能にします。 これは、JAAS ログインを使用して実行依頼者の WSPrincipal でログインすることで行えます。 セキュリティー・コンテキストにない、実行依頼者のサブジェクト内の情報に関する詳細については、 concurrent-1.0 フィーチャーの制約事項を参照してください。
重要: スタック製品内のフィーチャーによって、 追加のスレッド・コンテキスト・プロバイダーが使用可能になる場合があります。 オプションの baseContextRef 属性により、コンテキスト・サービス・インスタンスは、 別のコンテキスト・サービス・インスタンスのコンテキスト構成を継承することができます。

スレッド・コンテキスト・サービス・インスタンスを (@Resource を使用して) アプリケーション・コンポーネントに注入したり、リソース環境参照 (resource-env-ref) で検索します。

  • 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>
  • @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);
    ...

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

インフォメーション・センターに関するご使用条件 | フィードバック


タイム・スタンプ・アイコン 最終更新: 2015 年 6 月 17日
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=phil&product=was-libcore-mp&topic=twlp_config_contextservice
ファイル名: twlp_config_contextservice.html