配置受管线程工厂

可配置 ManagedThreadFactory 实例以创建新线程,这些线程与从中查找或注入受管线程工厂的线程的线程上下文一起运行。Java™ EE 应用程序最好避免直接管理它们自己的线程;因此,ManagedThreadFactory 扩展 JSE ThreadFactory 来提供一种方法以在应用程序服务器环境内创建受管线程。您还可配置 ManagedThreadFactory 以捕获与 Java EE 应用程序相关的线程上下文并将其传播至新线程。

关于此任务

受管线程工厂在 <concurrent-1.0> 功能部件下,并且在 server.xml 文件中按如下方式启用:
<featureManager>
	<feature>concurrent-1.0</feature>
</featureManager>

线程上下文捕获和传播由上下文服务管理。服务器会创建上下文服务的缺省实例 (DefaultContextService),该实例配置为至少传播 classloaderContextjeeMetadataContextsecurityContext。如果 ManagedThreadFactory 未指定上下文服务,那么会使用此缺省上下文服务实例。有关上下文服务实例的更多信息,请参阅“配置线程上下文服务实例”主题。

ManagedThreadFactory 的缺省实例 (DefaultManagedThreadFactory) 以 java:comp/DefaultManagedThreadFactory 形式提供,并使用缺省上下文服务实例来捕获和传播线程上下文。

过程

server.xml 文件中的示例配置:

示例

受管线程工厂可注入到应用程序组件中(通过使用 @Resource)或使用资源环境引用 (resource-env-ref) 进行查找。无论如何获取实例,都可按可互换方式将其用作 javax.enterprise.concurrent.ManagedThreadFactoryjava.util.concurrent.ThreadFactory

  • 查找缺省受管线程工厂的示例:
    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

用于指示主题类型的图标 任务主题

文件名:twlp_config_threadfactory.html