![[8.5.5.4 或更高版本]](../ng_v8554.gif)
配置受管线程工厂
可配置 ManagedThreadFactory 实例以创建新线程,这些线程与从中查找或插入受管线程工厂的线程的线程上下文一起运行。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 文件中的示例配置:
示例
受管线程工厂可插入到应用程序组件中(通过使用 @Resource)或使用资源环境引用 (resource-env-ref) 进行查找。不管如何获取该实例,都可按可互换方式将其用作 javax.enterprise.concurrent.ManagedThreadFactory 或 java.util.concurrent.ThreadFactory。
- 使用 @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