管理対象スレッド・ファクトリーの構成

管理対象スレッド・ファクトリーの検索または注入元のスレッドのスレッド・コンテキストで実行する新しいスレッドを作成するように、 ManagedThreadFactory インスタンスを構成することができます。 Java™ EE アプリケーションでのベスト・プラクティスは、アプリケーション独自のスレッドを直接管理するのを避けることです。 そのため、ManagedThreadFactory は、JSE ThreadFactory を拡張して、アプリケーション・サーバー環境内で管理対象スレッドを作成するための方法を提供しています。 また、Java EE アプリケーションに関連するスレッド・コンテキストをキャプチャーして、 新しいスレッドに伝搬するよう ManagedThreadFactory を構成することもできます。

このタスクについて

管理対象スレッド・ファクトリーは、以下に示すように <concurrent-1.0> フィーチャーの下にあり、server.xml ファイル内で使用可能になります。
<featureManager>
	<feature>concurrent-1.0</feature>
</featureManager>

スレッド・コンテキストのキャプチャーと伝搬は、コンテキスト・サービスによって管理されます。 コンテキスト・サービスのデフォルト・インスタンス (DefaultContextService) はサーバーによって作成され、少なくとも classloaderContextjeeMetadataContext および securityContext を伝搬するよう構成されます。ManagedThreadFactory がコンテキスト・サービスを指定していない場合、 このデフォルト・コンテキスト・サービス・インスタンスが使用されます。コンテキスト・サービス・インスタンスについて詳しくは、スレッド・コンテキスト・サービス・インスタンスの構成のトピックを参照してください。

ManagedThreadFactory のデフォルト・インスタンス (DefaultManagedThreadFactory) は、 java:comp/DefaultManagedThreadFactory として使用でき、 スレッド・コンテキストのキャプチャーおよび伝搬にデフォルトのコンテキスト・サービス・インスタンスを使用します。

手順

server.xml ファイルの構成例:

管理対象スレッド・ファクトリーは、(@Resource を使用して) アプリケーション・コンポーネントに注入したり、リソース環境参照 (resource-env-ref) で検索したりできます。 インスタンスの取得方法に関係なく、javax.enterprise.concurrent.ManagedThreadFactory または java.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>
  • Example lookup that uses a resource environment reference:
    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