スケジューラーは、デフォルトでは、単一のグローバル・トランザクションでタスクを実行します。 サービス品質 QOS_ONLYONCE または QOS_ATLEASTONCE を使用して、タスクを単一の作業単位として一度だけ実行するか、独立したトランザクションとして実行するかを指定できます。
スケジューラーは、デフォルトでは単一のグローバル・トランザクションでタスクを実行するので、このトランザクションは、タスクが完了するか失敗するまでオープンになっています。トランザクションに含まれるリソースは、何十分または何時間にも及ぶような長時間タスクが稼働している場合、さまざまなタイムアウトやタスクのスレッドが ハングとして識別されます。
TaskInfo.setQOS メソッドは、タスクが少なくとも 1 つは稼働するというサービス品質の低下を許可します。 タスクを TaskInfo.QOS_ATLEASTONCE に設定した場合、タスクが稼働している間中トランザクションをオープンし続けません。 スケジューラーがタスクの結果を更新できない場合、このサービスの品質がすでにトランザクションでないため、タスクは複数回にわたって開始する可能性があります。 このサービスの品質はバッチ・ジョブに最適です。 ビジネス・ロジック内のチェックポイントで QOS_ATLEASTONCE を使用してください。それにより、タスクが回復する必要がある場合、ビジネス・ロジックは次のチェックポイントで継続できます。 詳しくは、com.ibm.websphere.scheduler.TaskInfo の API 文書を参照してください。
このようなリソースとしては、 スケジューラー用に構成された JDBC データ・ソース、MessageTaskInfo オブジェクトによって使用される JMS サービス、 およびトランザクション設定が「必要」である UserCalendar、TaskHandler、または NotificationSink Bean のいずれかの中で使用されるリソースなどがあります。
すべての予期しない例外は、アクティビティー・ログに記録され、 タスクのグローバル・トランザクション に関与するすべてのイベントがロールバックされます。 このイベントとしては、 タスクのデータベース・レコードの変更などがあります。この変更が行われると、スケジューラー・デーモンが次のポーリング・サイクルの間にデータベースをポーリングするときに、 タスクが強制的に再度実行されます。 UserCalendar、TaskHandler、および NotificationSink Bean では、Bean のトランザクション設定を「新規必要」に構成して、グローバル・トランザクションには関与しないようにできます。
実行状態がデータベースに書き込まれた後、さらに結果が書き込まれる前に失敗が生じた場合、 タスクは複数回実行する可能性があります。
タスク実行中はグローバル・トランザクションが使用できないので、QOS_ATLEASTONCE を使用した場合、すべての NotificationSink、UserCalendar および TaskHandler Bean はトランザクション (TX_MANDATORY) を要求することができません。 EJB コンポーネントは、「必要」または「新規必要」コンテナー管理のトランザクション、または Bean 管理のトランザクションを使用します。
すべてのスケジューラー・ インターフェース・メソッドは、 単一のグローバル・トランザクション・コンテキスト内で使用されます。 グローバル・トランザクション・コンテキストが、create()、suspend()、resume()、cancel()、および purge() メソッドの実行時に既にスレッドにある場合は、続いて、既存のグローバル・トランザクションが 使用されます。 それ以外の場合は、新規のグローバル・トランザクションが開始されます。
スケジューラー・インターフェース・メソッドが、呼び出し元のグローバル・トランザクションで使用され、予期しないエラーが発生した場合、 その後、このトランザクションは、ロールバックするようマークされます。 例外が宣言済み例外の場合、この例外は、呼び出し元に再実行依頼され、 トランザクションは、呼び出し元によってコミットまたはロールバックされるよう、そのままにしておかれます。
このメソッドが独自のグローバル・トランザクションを開始して例外が発生した場合、 その後、トランザクションはロールバックされ、例外が呼び出し元に再度スローされます。