配置受管理執行緒 Factory

您可以配置 ManagedThreadFactory 實例,來建立新的執行緒,以便與要從中查閱或注入受管理執行緒 Factory 之執行緒的執行緒環境定義搭配執行。Java™ EE 應用程式的最佳作法是避免直接管理它們自己的執行緒;因此,ManagedThreadFactory 會延伸 JSE ThreadFactory,藉以在應用程式伺服器環境內建立受管理執行緒。您也可以配置 ManagedThreadFactory,以擷取 Java EE 應用程式相關的執行緒環境定義,並將它傳播至新的執行緒。

關於這項作業

受管理執行緒 Factory 是在 <concurrent-1.0> 特性之下提供,並於 server.xml 檔中啟用,如下所示:
<featureManager>
		<feature>concurrent-1.0</feature>
</featureManager>

執行緒環境定義的擷取和傳播是由環境定義服務管理。伺服器會建立環境定義服務 (DefaultContextService) 的預設實例,且該預設實例會配置成至少傳播 classloaderContextjeeMetadataContextsecurityContext。如果 ManagedThreadFactory 沒有指定環境定義服務,會使用這個預設環境定義服務實例。如需環境定義服務實例的相關資訊,請參閱「配置執行緒環境定義服務實例」主題。

ManagedThreadFactory 預設實例 (DefaultManagedThreadFactory) 是以 java:comp/DefaultManagedThreadFactory 來提供,且會使用預設環境定義服務實例來擷取和傳播執行緒環境定義。

程序

server.xml 檔中的配置範例:

範例

受管理執行緒 Factory 可以注入應用程式元件中(使用 @Resource),或利用資源環境參照 (resource-env-ref) 來查閱。 不論如何取得實例,都可以將它當作 javax.enterprise.concurrent.ManagedThreadFactoryjava.util.concurrent.ThreadFactory 來以可交換方式使用。

  • 查閱預設受管理執行緒 Factory 的範例:
    ManagedThreadFactory threadFactory =
        (ManagedThreadFactory) new InitialContext().lookup(
            "java:comp/DefaultManagedThreadFactory");
    // 建立一個執行程式,使它一律用受管理執行緒 Factory 的執行緒環境定義來執行作業
    ExecutorService executor = new ThreadPoolExecutor(
        coreThreads, maxThreads, keepAliveTime, TimeUnit.MINUTES,
        new ArrayBlockingQueue<Runnable>(workRequestQueueSize),
        threadFactory, new ThreadPoolExecutor.AbortPolicy());
  • 使用 @Resource 來注入成 java.util.concurrent.ThreadFactory 的範例:
    @Resource(lookup="concurrent/threadFactory2")
    ThreadFactory threadFactory
    ...
    
    // 建立新執行緒
    Thread dailySalesAnalysisTask = threadFactory.newThread(new Runnable() {
      public void run() {
          // 由於配置了 <jeeMetadataContext>,因此有可能進行 java:comp 查閱
        DataSource ds = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/ds1");
        ... analyze the data
      }
    });
    dailySalesAnalysisTask.start();
  • 使用 @Resource 來注入成 javax.enterprise.concurrent.ManagedThreadFactory 的範例:
    @Resource(lookup="concurrent/threadFactory2")
    ManagedThreadFactory threadFactory;
    
    ... usage is same as previous example
  • web.xml 檔中 java.util.concurrent.ThreadFactory<resource-env-ref> 範例:
    <resource-env-ref>
    	<resource-env-ref-name>concurrent/threadFactory1</resource-env-ref-name>
    	<resource-env-ref-type>java.util.concurrent.ThreadFactory</resource-env-ref-type>
    </resource-env-ref>
  • web.xml 檔中 javax.enterprise.concurrent.ManagedThreadFactory<resource-env-ref> 範例:
    <resource-env-ref>
    	<resource-env-ref-name>concurrent/threadFactory2</resource-env-ref-name>
    	<resource-env-ref-type>javax.enterprise.concurrent.ManagedThreadFactory</resource-
    env-ref-type>
    </resource-env-ref>
  • 使用資源環境參照的查閱範例:
    ManagedThreadFactory threadFactory =
      (ManagedThreadFactory) new InitialContext().lookup("java:comp/env/concurrent/threadFactory");
    // 建立已排程的執行程式,且它一律使用受管理執行緒 Factory 的執行緒環境定義來執行作業
    ScheduledExecutorService executor = Executors.newScheduledThreadPool(5, threadFactory);
    ... use executor to schedule tasks from any thread

指示主題類型的圖示 作業主題



「時間戳記」圖示 前次更新: 2016 年 11 月 30 日
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twlp_config_threadfactory
檔名:twlp_config_threadfactory.html