配置受管理執行緒 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 來以可交換方式使用。
- 查閱預設受管理執行緒 Factory 的範例:
ManagedThreadFactory threadFactory = (ManagedThreadFactory) new InitialContext().lookup( "java:comp/DefaultManagedThreadFactory"); // Create an executor that always runs tasks with the thread context of the managed thread 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 ... // create a new thread Thread dailySalesAnalysisTask = threadFactory.newThread(new Runnable() { public void run() { // java:comp lookup is possible because <jeeMetadataContext> is configured 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"); // Create a scheduled executor that always runs tasks with the thread context of the managed thread factory ScheduledExecutorService executor = Executors.newScheduledThreadPool(5, threadFactory); ... use executor to schedule tasks from any thread