[8.5.5.4 或更新版本]

配置執行緒環境定義服務實例

您可以配置 ContextService 實例,以擷取受管理執行緒環境定義,並且套用它,以便在任何執行緒上呼叫指定的介面方法。

關於這項作業

Java™ EE 應用程式的最佳作法是避免直接管理自己的執行緒;因此,藉由 ContextService,您就可以將先前擷取的執行緒環境定義,建立到未受管理及受管理的執行緒中,以就地覆蓋任何執行緒環境定義。

程序

server.xml 檔中啟用執行緒環境定義服務。執行緒環境定義服務可在 <concurrent-1.0> 特性之下提供。
<featureManager>
		<feature>concurrent-1.0</feature>
</featureManager>

結果

伺服器會建立預設執行緒環境定義服務實例 (DefaultContextService),且會配置成至少擷取和延伸 classloaderContextjeeMetadataContextsecurityContext。您可以配置執行緒環境定義延伸,來包含下列執行緒環境定義類型:

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 檔中的配置範例:
    • concurrent/threadContextSvc1 名稱登錄在 JNDI 中,並且只擷取和延伸 jeeMetadataContext 的執行緒環境定義服務:
      <contextService id="threadContextSvc1" jndiName="concurrent/${id}">
      	<jeeMetadataContext/>
      </contextService>
    • 含有 classloaderContextsecurityContext 的執行緒環境定義服務:
      <contextService jndiName="concurrent/threadContextSvc2">
      	<classloaderContext/>
      	<securityContext/>
      </securityContext/>
    • threadContextSvc1 繼承 jeeMetadataContext,並且新增 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;
    	} 
    };  
    // 擷取現行應用程式元件的執行緒環境定義
    execProps = Collections.singletonMap(ManagedTask.TRANSACTION,
    ManagedTask.USE_TRANSACTION_OF_EXECUTION_THREAD);
    processSalesOrderCompletion = (Callable<Boolean>)
     threadContextSvc1.createContextualProxy(processSaleCompletion, execProps,
    Callable.class);
    
    //之後來自不同的應用程式元件
    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 月 22 日
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=phil&product=was-libcore-mp&topic=twlp_config_contextservice
檔名:twlp_config_contextservice.html