第9章 コンカレンシーユーティリティー
コンカレンシーユーティリティーは、Java SE コンカレンシーユーティリティーを Java EE アプリケーション環境仕様で使用できるようにする API であり、JSR 236: Concurrency Utilities for Java™ EE で定義されています。JBoss EAP では、EE コンカレンシーユーティリティーのインスタンスを作成、編集、および削除でき、その結果、これらのインスタンスがアプリケーションで使用できるようになります。
コンカレンシーユーティリティーを使用すると、既存のコンテキストのアプリケーションスレッドをプルし、独自のスレッドで使用することにより、呼び出しコンテキストを拡張できるようになります。呼び出しコンテキストのこの拡張には、デフォルトでクラスローディング、JNDI、およびセキュリティーコンテキストが含まれます。
コンカレンシーユーティリティーのタイプには以下のものが含まれます。
- コンテキストサービス
- 管理対象スレッドファクトリー
- 管理対象エグゼキューターサービス
- 管理対象スケジュール済みエグゼキューターサービス
standalone.xml のコンカレンシーユーティリティー
<subsystem xmlns="urn:jboss:domain:ee:4.0"> <spec-descriptor-property-replacement>false</spec-descriptor-property-replacement> <concurrent> <context-services> <context-service name="default" jndi-name="java:jboss/ee/concurrency/context/default" use-transaction-setup-provider="true"/> </context-services> <managed-thread-factories> <managed-thread-factory name="default" jndi-name="java:jboss/ee/concurrency/factory/default" context-service="default"/> </managed-thread-factories> <managed-executor-services> <managed-executor-service name="default" jndi-name="java:jboss/ee/concurrency/executor/default" context-service="default" hung-task-threshold="60000" keepalive-time="5000"/> </managed-executor-services> <managed-scheduled-executor-services> <managed-scheduled-executor-service name="default" jndi-name="java:jboss/ee/concurrency/scheduler/default" context-service="default" hung-task-threshold="60000" keepalive-time="3000"/> </managed-scheduled-executor-services> </concurrent> <default-bindings context-service="java:jboss/ee/concurrency/context/default" datasource="java:jboss/datasources/ExampleDS" managed-executor-service="java:jboss/ee/concurrency/executor/default" managed-scheduled-executor-service="java:jboss/ee/concurrency/scheduler/default" managed-thread-factory="java:jboss/ee/concurrency/factory/default"/> </subsystem>
9.1. コンテキストサービス
コンテキストサービス (javax.enterprise.concurrent.ContextService
) を使用すると、既存のオブジェクトからコンテキストプロキシをビルドできます。コンテキストプロキシにより、コンテキストが作成または呼び出されたとき (呼び出しが元のオブジェクトに転送される前) に他のコンカレンシーユーティリティーによって使用される呼び出しコンテキストが準備されます。
コンテキストサービスコンカレンシーユーティリティーの属性には以下のものが含まれます。
-
name
: すべてのコンテキストサービス内の一意の名前。 -
jndi-name
: JNDI でコンテキストサービスを配置する場所を定義します。 -
use-transaction-setup-provider
: オプション。プロキシオブジェクトを呼び出す場合に、コンテキストサービスによってビルドされたコンテキストプロキシがコンテキストでトランザクションを一時停止するかどうかを示します。デフォルト値はfalse
ですが、デフォルトのコンテキストサービスの値はtrue
です。
コンテキストサービスコンカレンシーユーティリティーの使用方法については、上記の例を参照してください。
新しいコンテキストサービスの追加
/subsystem=ee/context-service=newContextService:add(jndi-name=java:jboss/ee/concurrency/contextservice/newContextService)
コンテキストサービスの変更
/subsystem=ee/context-service=newContextService:write-attribute(name=jndi-name, value=java:jboss/ee/concurrency/contextservice/changedContextService)
この操作にはリロードが必要です。
コンテキストサービスの削除
/subsystem=ee/context-service=newContextService:remove()
この操作にはリロードが必要です。
9.2. 管理対象スレッドファクトリー
管理対象スレッドファクトリー (javax.enterprise.concurrent.ManagedThreadFactory)
コンカレンシーユーティリティーを使用すると、Java EE アプリで Java スレッドを作成できます。JBoss EAP は管理対象スレッドファクトリーインスタンスを処理するため、Java EE アプリケーションはライフサイクル関連メソッドを呼び出すことができません。
管理対象スレッドファクトリーコンカレンシーユーティリティーの属性には以下のものがあります。
-
context-service
: すべての管理対象スレッドファクトリー内の一意の名前。 -
jndi-name
: JNDI で管理対象スレッドファクトリーを配置する場所を定義します。 -
priority
: オプション。ファクトリーにより作成された新しいスレッドの優先度を示します。デフォルト値は 5 です。
新しい管理対象スレッドファクトリーの追加
/subsystem=ee/managed-thread-factory=newManagedTF:add(context-service=newContextService, jndi-name=java:jboss/ee/concurrency/threadfactory/newManagedTF, priority=2)
管理対象スレッドファクトリーの変更
/subsystem=ee/managed-thread-factory=newManagedTF:write-attribute(name=jndi-name, value=java:jboss/ee/concurrency/threadfactory/changedManagedTF)
この操作にはリロードが必要です。同様に、他の属性を変更することもできます。
管理対象スレッドファクトリーの削除
/subsystem=ee/managed-thread-factory=newManagedTF:remove()
この操作にはリロードが必要です。
9.3. 管理対象エグゼキューターサービス
管理対象エグゼキューターサービス (javax.enterprise.concurrent.ManagedExecutorService)
を使用すると、Java EE アプリケーションで非同期実行向けタスクを送信できます。JBoss EAP は管理対象エグゼキューターサービスインスタンスを処理するため、Java EE アプリケーションはライフサイクル関連メソッドを呼び出すことができません。
管理対象エグゼキューターサービスコンカレンシーユーティリティーの属性には以下のものがあります。
-
context-service
: オプション。既存のコンテキストサービスをその名前で参照します。指定された場合は、参照されたコンテキストサービスがタスクをエグゼキューターに送信したときに存在する呼び出しコンテキストを取得します (このコンテキストはタスクの実行時に使用されます)。 -
jndi-name
: JNDI で管理対象スレッドファクトリーを配置する場所を定義します。 -
max-threads
: エグゼキューターにより使用されるスレッドの最大数を定義します。デフォルト値はInteger.MAX_VALUE
です。 -
thread-factory
: 既存の管理対象スレッドファクトリーをその名前で参照して内部スレッドの作成を処理します。指定されない場合は、デフォルト設定の管理対象スレッドファクトリーが作成され、内部で使用されます。 -
core-threads
: エグゼキューターのプールに保持するスレッド数を提供します (スレッドはアイドル状態であるものも含みます)。値が 0 の場合は、制限がないことを意味します。 -
keepalive-time
: 内部スレッドをアイドル状態にできる時間 (ミリ秒単位) を定義します。属性のデフォルト値は 60000 です。 -
queue-length
: 入力キューに格納できるタスクの数を示します。デフォルト値は 0 であり、キューの容量が無制限であることを意味します。 -
hung-task-threshold
: ミリ秒単位の時間を定義します。この時間が経過すると、管理対象エグゼキューターサービスによってタスクがハング状態にあると見なされ、強制終了します。値が 0 (デフォルト値) の場合、タスクはハング状態にあると見なされません。 -
long-running-tasks
: 長時間実行中のタスクの実行の最適化を推奨します。デフォルト値は false です。 -
reject-policy
: タスクがエグゼキューターにより拒否されたときに使用するポリシーを定義します。属性値はデフォルトのABORT
(例外がスローされます) またはRETRY_ABORT
(エグゼキューターは例外をスローする前にもう一度例外を送信しようとします) のいずれかになります。
新しい管理対象エグゼキューターサービスの追加
/subsystem=ee/managed-executor-service=newManagedExecutorService:add(jndi-name=java:jboss/ee/concurrency/executor/newManagedExecutorService, core-threads=7, thread-factory=default)
管理対象エグゼキューターサービスの変更
/subsystem=ee/managed-executor-service=newManagedExecutorService:write-attribute(name=core-threads,value=10)
この操作にはリロードが必要です。同様に、他の属性を変更することもできます。
管理対象エグゼキューターサービスの削除
/subsystem=ee/managed-executor-service=newManagedExecutorService:remove()
この操作にはリロードが必要です。
9.4. 管理対象スケジュール済みエグゼキューターサービス
管理対象スケジュール済みエグゼキューターサービス (javax.enterprise.concurrent.ManagedScheduledExecutorService)
を使用すると、Java EE アプリケーションで非同期実行向けタスクをスケジュールできます。JBoss EAP は管理対象スケジュール済みエグゼキューターサービスインスタンスを処理するため、Java EE アプリケーションはライフサイクル関連メソッドを呼び出すことができません。
管理対象エグゼキューターサービスコンカレンシーユーティリティーの属性には以下のものがあります。
-
context-service
: 既存のコンテキストサービスをその名前で参照します。指定された場合は、参照されたコンテキストサービスがタスクをエグゼキューターに送信したときに存在する呼び出しコンテキストを取得します (このコンテキストはタスクの実行時に使用されます)。 -
hung-task-threshold
: ミリ秒単位の時間を定義します。この時間が経過すると、管理対象スケジュール済みエグゼキューターサービスによってタスクがハング状態にあると見なされ、強制終了します。値が 0 (デフォルト値) の場合、タスクはハング状態にあると見なされません。 -
keepalive-time
: 内部スレッドをアイドル状態にできる時間 (ミリ秒単位) を定義します。属性のデフォルト値は 60000 です。 -
reject-policy
: タスクがエグゼキューターにより拒否されたときに使用するポリシーを定義します。属性値はデフォルトのABORT
(例外がスローされます) またはRETRY_ABORT
(エグゼキューターは例外をスローする前にもう一度例外を送信しようとします) のいずれかになります。 -
core-threads
: エグゼキューターのプールに保持するスレッド数を提供します (スレッドはアイドル状態であるものも含みます)。値が 0 の場合は、制限がないことを意味します。 -
jndi-name
: JNDI で管理対象スケジュール済みエグゼキューターサービスを配置する場所を定義します。 -
long-running-tasks
: 長時間実行中のタスクの実行の最適化を推奨します。デフォルト値は false です。 -
thread-factory
: 既存の管理対象スレッドファクトリーをその名前で参照して内部スレッドの作成を処理します。指定されない場合は、デフォルト設定の管理対象スレッドファクトリーが作成され、内部で使用されます。
新しい管理対象スケジュール済みエグゼキューターサービスの追加
/subsystem=ee/managed-scheduled-executor-service=newManagedScheduledExecutorService:add(jndi-name=java:jboss/ee/concurrency/scheduledexecutor/newManagedScheduledExecutorService, core-threads=7, context-service=default)
この操作にはリロードが必要です。
管理対象スケジュール済みエグゼキューターサービスの変更
/subsystem=ee/managed-scheduled-executor-service=newManagedScheduledExecutorService:write-attribute(name=core-threads, value=10)
この操作にはリロードが必要です。同様に、他の属性を変更することができます。
管理対象スケジュール済みエグゼキューターサービスの削除
/subsystem=ee/managed-scheduled-executor-service=newManagedScheduledExecutorService:remove()
この操作にはリロードが必要です。