14.8 ManagedExecutorServiceの動作
ManagedExecutorServiceのチューニングプロパティ設定値は,J2EEサーバ起動時にメッセージログに出力されるメッセージKDJE60811-Iで確認できます。
JNDI名の重複や不正値の使用などによって,ManagedExecutorServiceのJNDI名前空間への登録に失敗した場合は,J2EEサーバ起動時にメッセージログにKDJE60812-Eが出力され,スタックトレースが例外ログに出力されますが,J2EEサーバの起動処理は続行します。
ManagedExecutorServiceのスレッドプールは,該当するスレッドプールを使用するタスクの初回実行時に初期化され,corePoolSizeに指定した数のスレッドが生成されます。生成されるスレッドは,スレッド名が「<JNDI名>-managedThreadFactory」から始まる名称で,生成された順に通番が付きます。
スレッドプール内のスレッド数は,Java SE API「java.util.concurrent.ThreadPoolExecutor」の仕様に従い,corePoolSize, maxPoolSize, taskQueueCapacityの指定値に応じて自動的に調整されます。
実行中のスレッド数がcorePoolSize未満の場合は,新規タスクはすぐに開始されます。
実行中のスレッド数がcorePoolSize 以上maxPoolSize未満の場合は,新規タスクはキューに貯められ,スレッドプールが空くまで待機します。
キューが満杯になると新しいスレッドが作成されて,キューの先頭からタスクが実行されます。作成されるスレッドは最大でmaxPoolSizeまでとなります。
実行中のスレッド数がmaxPoolSizeに達していて,かつキューが満杯の場合は,新規タスクは拒否され,javax.enterprise.concurrent.ManagedExecutorServiceインタフェースのexecuteメソッドまたはsubmitメソッドからjava.util.concurrent.RejectedExecutionExceptionがスローされます。
corePoolSize と maxPoolSize を同じ値に設定すると,固定サイズのスレッドプールが作成されます。デフォルトではcorePoolSizeとmaxPoolSizeがともに16のため,プール数が16個固定のスレッドプールが生成されます。
ManagedExecutorServiceのスレッドプールはJ2EEサーバ停止時に破棄されます。破棄が完了するとメッセージログにKDJE60823-Iが出力されます。破棄処理時に何らかの例外が発生した場合は,メッセージログにKDJE60824-E,例外ログにスタックトレースが出力され,J2EEサーバ停止処理を続行します。
J2EEサーバ停止処理中に実行中のタスクが残っていた場合は,awaitTerminationSecondsの値に応じて,次の動作をします。
-
awaitTerminationが0の場合
メッセージログにKDJE60822-Wが出力され,実行中のタスクは強制停止されます。
-
awaitTerminationが1以上の場合
メッセージログにKDJE60820-Iが出力され,awaitTermination設定時間分待機します。awaitTermination設定時間経過後も実行中のタスクが残った場合は,メッセージログにKDJE60821-Wが出力され,残っていたタスクは強制停止されます。