スケジューラーを使用したタスク管理メソッド
スケジューラーは、いくつかのタスク管理メソッドを備えています。
- suspend()
- タスクを中断します。 タスクは、再開されるまで実行しません。
- resume()
- 以前に中断したタスクを再開します。
- cancel()
- タスクをキャンセルします。 タスクは実行されないため、再開することはできません。
- purge()
- 取り消されたタスクをパーシスタント・ストアから完全に削除します。
- getStatus()
- タスクの現行の状況を戻します。
//Create the task.
TaskInfo taskInfo = ...
TaskStatus status = scheduler.create(taskInfo);
//Get the task ID
String taskId = status.getTaskId();
//Cancel the task. Specify the purgeAlso flag so that the task does not remain in the persistent store
scheduler.cancel(taskId,true);
set jndiName sched/MyScheduler
# Map the JNDI name to the mbean name. The mbean name is
# formed by replacing the / in the jndi name with . and prepending
# Scheduler_
regsub -all {/} $jndiName "." jndiNameset mbeanName Scheduler_$jndiName
puts "Looking-up Scheduler MBean $mbeanName"
set sched [$AdminControl queryNames WebSphere:*,type=WASScheduler,name=$mbeanName]
puts $sched
# Get the ObjectName format of the Scheduler MBean
set schedO [$AdminControl makeObjectName $sched]
# Create a TaskInfo object…
# (Some code excluded…)
set params [java::new {java.lang.Object[]} 1]
$params set 0 $taskInfo
set sigs [java::new {java.lang.String[]} 1]
$sigs set 0 com.ibm.websphere.scheduler.TaskInfo
set taskStatus [java::cast com.ibm.websphere.scheduler.TaskStatus [$AdminControl invoke_jmx $schedO create $params $sigs]]
set taskID [$taskStatus getTaskId]
puts "Task Created. TaskID= $taskID"
# Cancel the task using the Task ID from the TaskStatus object returned during create.
set params [java::new {java.lang.Object[]} 1]
$params set 0 false
set sigs [java::new {java.lang.String[]} 1]
$sigs set 0 java.lang.boolean
set taskStatus [java::cast com.ibm.websphere.scheduler.TaskStatus [$AdminControl invoke_jmx $schedO cancel $params $sigs]]
トランザクション。 スケジューラー API のメソッドは、すべてトランザクションです。 グローバル・トランザクション・コンテキストが存在する場合は、これを使用して操作が行われます。予期しない例外がスローされた場合には、 トランザクションにロールバックのマークが付けられるため、呼び出し元では適切な処理を行う必要があります。 予期された 例外または宣言された例外がスローされた場合、トランザクションは維持され、呼び出し元はロールバックを行うか、または トランザクションをコミットするかを選択する必要があります。 いずれかの時点でトランザクションがロールバックされると、 そのトランザクション内で実行されたスケジューラー操作もすべてロールバックされます。
ローカル・トランザクション ・コンテキストが存在する場合は、これが中断され、新規のグローバル・トランザクション・コンテキストが開始されます。 同様に、 アクティブなトランザクション・コンテキストがない場合は、グローバル・トランザクション・コンテキストが開始されます。いずれの場合も、 予期しない例外がスローされると、トランザクションはロールバックされます。 宣言された例外がスローされると、トランザクションは コミットされます。
当該タスクを別のスレッドが同時に修正している 場合は、TaskPending 例外がスローされます。 これは、スケジューラーがデータベースをオプティミスティックにロックするためです。その後、呼び出し元のアプリケーションは、操作を再試行できます。
タスクが現在実行中の場合には、タスク管理機能がブロックすることがあります。 スケジューラーによって各タスクが一度だけ実行されるため、タスクの実行中には他のタスクをロックする必要があります。 同様に、管理機能の 1 つを使用してタスクを変更したにもかかわらず、グローバル・トランザクションがコミットされない場合も、そのタスクの 別のトランザクションから発行された他の管理機能がすべてブロックされます。
Stateless Session Bean タスクの TaskHandler.process() メソッドは、自身の状態を変更できます。 ただし、このタスクは、スケジューラーと同じトランザクション内で実行する必要があります。したがって、 実行中のタスクに変更を加える ことができるのは、コンテナー管理トランザクション・タイプとして、Required または Mandatory を 使用している場合のみです。Requires New トランザクション・タイプが process() メソッドに指定されている場合には、すべての管理機能が デッドロックします。
スケジューラー API によって定義されているすべてのメソッドについては、API 文書を参照してください。