![[8.5.5.4 或更新版本]](../ng_v8554.gif)
配置受管理執行緒 Factory
您可以配置 ManagedThreadFactory 實例,來建立新的執行緒,以便與要從中查閱或注入受管理執行緒 Factory 之執行緒的執行緒環境定義搭配執行。Java™ EE 應用程式的最佳作法是避免直接管理它們自己的執行緒;因此,ManagedThreadFactory 會延伸 JSE ThreadFactory,藉以在應用程式伺服器環境內建立受管理執行緒。您也可以配置 ManagedThreadFactory,以擷取 Java EE 應用程式相關的執行緒環境定義,並將它延伸至新的執行緒。
關於這項作業
<featureManager>
<feature>concurrent-1.0</feature>
</featureManager>
執行緒環境定義的擷取和延伸是由環境定義服務管理。伺服器會建立環境定義服務 (DefaultContextService) 的預設實例,且該預設實例會配置成至少延伸 classloaderContext、jeeMetadataContext 和 securityContext。如果 ManagedThreadFactory 沒有指定環境定義服務,會使用這個預設環境定義服務實例。如需環境定義服務實例的相關資訊,請參閱「配置執行緒環境定義服務實例」主題。
ManagedThreadFactory 預設實例 (DefaultManagedThreadFactory) 是以 java:comp/DefaultManagedThreadFactory 來提供,且會使用預設環境定義服務實例來擷取和延伸執行緒環境定義。
程序
server.xml 檔中的配置範例:
範例
受管理執行緒 Factory 可以注入應用程式元件中(使用 @Resource),或利用資源環境參照 (resource-env-ref) 來查閱。 不論如何取得實例,都可以將它當作 javax.enterprise.concurrent.ManagedThreadFactory 或 java.util.concurrent.ThreadFactory 來以可交換方式使用。
- 使用 @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