トランザクションおよびスケジューラー
スケジューラーは、デフォルトでは、単一のグローバル・トランザクションでタスクを実行します。 サービス品質 QOS_ONLYONCE または QOS_ATLEASTONCE を使用して、タスクを単一の作業単位として一度だけ実行するか、独立したトランザクションとして実行するかを指定できます。
タスク実行の際のトランザクション動作
スケジューラーは、デフォルトでは単一のグローバル・トランザクションでタスクを実行するので、このトランザクションは、タスクが完了するか失敗するまでオープンになっています。トランザクションに含まれるリソースは、何十分または何時間にも及ぶような長時間タスクが稼働している場合、さまざまなタイムアウトやタスクのスレッドが ハングとして識別されます。
QOS_ONLYONCE
- タスクを作成したアプリケーションのコンテキストが、スレッドに適用される。
- グローバル・トランザクション・コンテキストが開始される。
- 次の実行時刻および開始時刻が、UserCalendar Bean または
DefaultUserCalendar を使用して計算される。重要: TaskInfo.EXECUTION_DELAYEDUPDATE オプションで TaskInfo.setTaskExcecutionOptions メソッドを使用した場合、このステップはレコードの更新後に発生する。
- タスク・データベースのタスク・レコードが、データベース内で次のタスクの状態を使用して更新されるか、またはタスクが完了し、タスクの自動パージ設定が true の場合は、削除される。
- タスク・データベースのレコードが、データベース内で次のタスクの状態を使用して更新されるか、またはタスクが完了し、タスクの自動パージ設定が true の場合は、削除される。 EXECUTION_DELAYEDUPDATE オプションを使用した場合、データベースはタスクの次の状態を反映せず、 TaskStatus.RUNNING 状態設定での現在の状態を反映する。
- NotificationSink Bean が設定されている場合、FIRING 通知が実行される。
- BeanTaskInfo または MessageTaskInfo オブジェクトがスタートする。
- タスクが失敗し、NotificationSink Bean が設定されている場合、FIRE_FAILED 通知が個別のトランザクションで実行される。
- タスクの NotificationSink Bean が設定されている場合、さまざまな通知が 要求どおり実行される。
- タスクに EXECUTION_DELAYEDUPDATE オプションが使用されると、データベースはタスクの次の状態で 2 度目の更新が行われる。
- グローバル・トランザクションがコミットされる。
- タスクのトランザクションに関与する各リソースが、2 フェーズ XA に対応していること。
このようなリソースとしては、スケジューラー用に構成された Java™ Database Connectivity (JDBC) データ・ソース、 MessageTaskInfo オブジェクトによって使用される Java Messaging Service (JMS) サービス、 およびトランザクション設定が「必須」である UserCalendar、TaskHandler、 または NotificationSink Bean のいずれかの中で使用されるリソースなどが あります。
- トランザクションを作成したアプリケーションの最終参加者サポートが使用可能な場合、1 つのリソースを 1 フェーズにできる。 アセンブリー・ツールを使用して、最終参加者サポートを使用可能にします。管理コンソールから最終参加者サポートを使用可能にすることもできます。 詳細については、トピック『最終参加者サポート拡張設定』を参照してください。
すべての予期しない例外はアクティビティー・ログに記録され、 タスクのグローバル・トランザクションに関与するすべてのイベントがロールバックされます。このとき、 タスクのデータベース・レコードの変更などが行われます。変更が行われると、スケジューラー・デーモンが次のポーリング・サイクルの間にデータベースをポーリングするときに、タスクが強制的に再度実行されます。 UserCalendar、TaskHandler、および NotificationSink Bean では、Bean のトランザクション設定を「新規必要」に構成して、グローバル・トランザクションには関与しないようにできます。
QOS_ATLEASTONCE
- タスクを作成したアプリケーションのコンテキストが、スレッドに適用される。
- タスクのデータベース・レコードはタスクが実行している状態で更新される。
- UserCalendar、NotificationSink Bean が呼び出される。
- BeanTaskInfo または MessageTaskInfo が開始される。
- 結果通知が送信される。
- 実行状態が書き込まれてからタスクに変更がない場合、データベースはタスクの次の状態で更新される。
実行状態がデータベースに書き込まれた後、さらに結果が書き込まれる前に失敗が生じた場合、 タスクは複数回実行する可能性があります。
タスク実行中はグローバル・トランザクションが使用できないので、QOS_ATLEASTONCE を使用した場合、すべての NotificationSink、UserCalendar および TaskHandler Bean はトランザクション (TX_MANDATORY) を要求することができません。 EJB コンポーネントは、「必要」または「新規必要」コンテナー管理のトランザクション、または Bean 管理のトランザクションを使用します。
スケジューラー API メソッド、または WASScheduler MBean オペレーション使用中のトランザクションの動作
すべてのスケジューラー・ インターフェース・メソッドは、 単一のグローバル・トランザクション・コンテキスト内で使用されます。 グローバル・トランザクション・コンテキストが、create()、suspend()、resume()、cancel()、および purge() メソッドの実行時に既にスレッドにある場合は、続いて、既存のグローバル・トランザクションが 使用されます。 それ以外の場合は、新規のグローバル・トランザクションが開始されます。
スケジューラー・インターフェース・メソッドが、呼び出し元のグローバル・トランザクションで使用され、予期しないエラーが発生した場合、 その後、このトランザクションは、ロールバックするようマークされます。 例外が宣言済み例外の場合、この例外は、呼び出し元に再実行依頼され、 トランザクションは、呼び出し元によってコミットまたはロールバックされるよう、そのままにしておかれます。
このメソッドが独自のグローバル・トランザクションを開始して例外が発生した場合、 その後、トランザクションはロールバックされ、例外が呼び出し元に再度スローされます。