終了通知と強制停止¶
一度タスクメッセージがタスクに変換されビジネスロジックが開始されると、通常は非同期処理機能はそのビジネスロジックが完了するまではタスクに対して何も干渉しません。
しかしながら、何らかの理由で実行中のタスクのビジネスロジックを中断したい場合、以下の方法があります。
- 終了通知
- 強制停止(非推奨)
コラム
他にもタスクの開発者が独自の終了方法を実装することも考えられますが、本書では説明の範囲外であるため割愛します。
終了通知と強制停止の違い¶
終了通知と強制停止は、いずれもタスクのビジネスロジックの実行途中で処理を中断させることを意図したものですが、終了通知と強制停止の違いに示すような違いがあります。
比較項目 | 終了通知 | 強制停止 |
---|---|---|
挙動 | 該当するタスクの Taskインタフェースのrelease()メソッドが非同期処理機能から呼び出されます。 | 該当するタスクのビジネスロジックを実行しているスレッドに対してjava.lang.Thread#stop()が非同期処理機能から呼び出されます。 |
開発者の責務 | 該当するタスクの開発者は Taskインタフェースのrelease()メソッドを適切に実装する必要があります。 | 該当するタスクの開発者は、ビジネスロジック中のいかなる時点でjava.lang.Thread#stop()が呼び出されても問題がないような実装をする必要があります。 |
終了通知¶
終了通知ではタスク処理サービスから該当するタスクのrelease()メソッドを呼び出します。
実際に実行中のタスクを停止するのは開発者の責務です。 開発者はrelease()メソッドが呼び出されたら、run()メソッドで実行中のビジネスロジックを安全かつ速やかに停止するような実装をしてください。
また、タスク処理サービスからrelease()メソッドが呼ばれたタスクは非同期処理機能の管理対象外です。
release()についてはTask#releaseを参照してください。
注意
タスクのビジネスロジックが終了しない状態でrelease()メソッドからタスク処理サービスに処理が戻された場合、後続のタスクの処理が開始されてしまう場合があります。 つまり、先に実行中のタスクのビジネスロジックと後続のタスクの処理が同時に実行されてしまう可能性があります。
このような状況を避けたい場合、後続のタスクが実行されても問題がない状態になるまで、先に実行中のタスクのrelease()メソッドの中で待機する、などの工夫が必要です。
注意
該当するタスクのrelease()メソッドに対して空の実装をする、または呼び出してもビジネスロジックの実行を終了しなくても終了通知を行うことは可能です。 ただし、この場合であっても、タスク処理サービスからrelease()メソッドが呼ばれたタスクは非同期処理機能の管理対象外です。
この状態で該当するタスクメッセージを再登録するような指定がされていた場合、同一の情報を持ちながら、最初に作成されたタスクとは異なるインスタンスが再作成され、ビジネスロジックが重複して実行される可能性があります。
Java¶
Javaで非同期処理機能のタスクに対して終了通知をする場合、jp.co.intra_mart.foundation.asynchronous.TaskManagerクラスの以下のメソッドを呼び出します。
- releaseRunningParallelizedTask
- releaseRunningSerializedTask
これらのメソッドを呼び出すことによってタスク処理サービスはJavaを通じてタスクのrelease()メソッドを呼び出します。
TaskManager#releaseRunningXXXXTask¶
public static jp.co.intra_mart.foundation.asynchronous.ParallelizedTaskMessage
releaseRunningParallelizedTask(
java.lang.String messageId,
boolean reentry,
boolean stop
) throws
jp.co.intra_mart.foundation.asynchronous.TaskControlException
public static jp.co.intra_mart.foundation.asynchronous.SerializedTaskMessage
releaseRunningSerializedTask(
java.lang.String messageId,
boolean reentry,
boolean stop
) throws
jp.co.intra_mart.foundation.asynchronous.TaskControlException
- releaseRunningParallelizedTaskは、対象となるタスクが並列タスクキューに登録されている場合に使用します。
- releaseRunningSerializedTaskは、対象となるタスクが直列タスクキューに登録されている場合に使用します。
messageIdには終了通知の対象となるタスクのメッセージIDを指定します。 メッセージIDはタスクメッセージの登録時(直列処理機能におけるタスクメッセージの登録、または、並列処理機能におけるタスクメッセージの登録を参照してください)に取得した値を使用してください。
reentryには終了通知が完了した後にタスクメッセージを再登録するかどうかを指定します。
- true : タスクメッセージを再登録します。
- false : タスクメッセージを再登録しません。
タスクメッセージの再登録の詳細についてはタスクメッセージの再登録を参照してください。
stopには終了通知が完了した後にタスクキューを停止するかどうかを指定します。
- true : タスクキューを現在の処理状態に関わらず停止します。
- false : タスクキューの現在の処理状態を変更しません。
タスクキューの停止の詳細についてはタスクキューの停止を参照してください。
サーバサイドJavaScript¶
サーバサイドJavaScriptで非同期処理機能のタスクに対して終了通知をする場合、 WorkManagerオブジェクトのreleaseRunningParallelizedTask関数を呼び出します。 この関数を呼び出すことによってタスク処理サービスはサーバサイドJavaScriptを通じてタスクのrelease()メソッドを呼び出します。
WorkManager#releaseRunningParallelizedTask¶
function releaseRunningParallelizedTask(messageId, reentry, stop)
messageIdには終了通知の対象となるタスクのメッセージIDを指定します。 メッセージIDはタスクメッセージの登録時(直列処理機能におけるタスクメッセージの登録、または、並列処理機能におけるタスクメッセージの登録を参照してください)に取得した値を使用してください。
reentryには終了通知が完了した後にタスクメッセージを再登録するかどうかを指定します。
- true : タスクメッセージを再登録します。
- false : タスクメッセージを再登録しません。
タスクメッセージの再登録の詳細についてはタスクメッセージの再登録を参照してください。
stopには終了通知が完了した後にタスクキューを停止するかどうかを指定します。
- true : タスクキューを現在の処理状態に関わらず停止します。
- false : タスクキューの現在の処理状態を変更しません。
タスクキューの停止の詳細についてはタスクキューの停止を参照してください。
このメソッドは戻り値としてメッセージIDを含む情報を返します。
強制停止¶
警告
この方法でタスクを停止することは非推奨です。 java.lang.Thread#stop()はビジネスロジック中のいかなる場所でも処理を中断して抜ける可能性があり、リソースやロックの解放等が想定通りに行われない可能性があります。
いかなる理由であっても、この方法を利用してタスクを停止し、何らかの被害が出た場合でも補償いたしかねますので注意してください。
タスクを中断する場合は終了通知に示す方法を推奨します。
強制停止ではタスク処理サービスから該当するタスクのビジネスロジックを実行しているスレッドに対してjava.lang.Thread#stop()を呼び出します。
また、タスク処理サービスを通じて強制停止されたタスクは非同期処理機能の管理対象外です。
Java¶
Javaで非同期処理機能のタスクに対して強制停止をする場合、jp.co.intra_mart.foundation.asynchronous.TaskManagerクラスの以下のメソッドを呼び出します。
- stopRunningParallelizedTask
- stopRunningSerializedTask
これらのメソッドを呼び出すことによってタスク処理サービスはJavaを通じてタスクのビジネスロジックを実行しているスレッドに対してjava.lang.Thread#stop()を呼び出します。
TaskManager#stopRunningXXXXTask¶
public static jp.co.intra_mart.foundation.asynchronous.ParallelizedTaskMessage
stopRunningParallelizedTask(
java.lang.String messageId,
boolean reentry,
boolean stop
) throws
jp.co.intra_mart.foundation.asynchronous.TaskControlException
public static SerializedTaskMessage stopRunningSerializedTask(
java.lang.String messageId,
boolean reentry,
boolean stop
) throws
jp.co.intra_mart.foundation.asynchronous.TaskControlException
- stopRunningParallelizedTaskは、対象となるタスクが並列タスクキューに登録されている場合に使用します。
- stopRunningSerializedTaskは、対象となるタスクが直列タスクキューに登録されている場合に使用します。
messageIdには強制停止の対象となるタスクのメッセージIDを指定します。 メッセージIDはタスクメッセージの登録時(直列処理機能におけるタスクメッセージの登録、または、並列処理機能におけるタスクメッセージの登録を参照してください)に取得した値を使用してください。
reentryには強制停止が完了した後にタスクメッセージを再登録するかどうかを指定します。
- true : タスクメッセージを再登録します。
- false : タスクメッセージを再登録しません。
タスクメッセージの再登録の詳細についてはタスクメッセージの再登録を参照してください。
stopには強制停止が完了した後にタスクキューを停止するかどうかを指定します。
- true : タスクキューを現在の処理状態に関わらず停止します。
- false : タスクキューの現在の処理状態を変更しません。
並列タスクキューの停止の詳細についてはタスクキューの停止を参照してください。
サーバサイドJavaScript¶
サーバサイドJavaScriptで非同期処理機能のタスクに対して\ 強制停止をする場合、 WorkManagerオブジェクトのreleaseRunningParallelizedTask関数を呼び出します。 この関数を呼び出すことによってタスク処理サービスはサーバサイドJavaScriptを通じてタスクのrelease()メソッドを呼び出します。
WorkManager#releaseRunningParallelizedTask¶
function releaseRunningParallelizedTask(messageId, reentry, stop)
messageIdには強制停止の対象となるタスクのメッセージIDを指定します。 メッセージIDはタスクメッセージの登録時(直列処理機能におけるタスクメッセージの登録、または、並列処理機能におけるタスクメッセージの登録を参照してください)に取得した値を使用してください。
reentryには強制停止が完了した後にタスクメッセージを再登録するかどうかを指定します。
- true : タスクメッセージを再登録します。
- false : タスクメッセージを再登録しません。
タスクメッセージの再登録の詳細についてはタスクメッセージの再登録を参照してください。
stopには強制停止が完了した後に並列タスクキューを停止するかどうかを指定します。
- true : 並列タスクキューを現在の処理状態に関わらず停止します。
- false : 並列タスクキューの現在の処理状態を変更しません。
並列タスクキューの停止の詳細についてはタスクキューの停止を参照してください。
このメソッドは戻り値としてメッセージIDを含む情報を返します。
タスクメッセージの再登録¶
終了通知または強制停止をされたタスクメッセージはタスクキューに再登録することが可能です。 再登録をする場合、タスクキューの先頭にタスクメッセージが追加されます。
再登録された場合でも、即時にビジネスロジックが開始されるわけではありません。 他のタスクメッセージと同様のものとして扱われます。 タスク処理を参照してください。
終了通知または強制停止をされたタスクメッセージが再登録された場合、以下の情報はそのまま引き継がれます。
- メッセージID
- 送信日時
- 受信日時
- パラメータ
タスクキューの停止¶
タスクが終了通知または強制停止をされた場合、対応するタスクキューの処理状態は以下のいずれかにすることができます。
- 現在の処理状態を継続する
- 現在の処理状態に関わらず、停止する
タスクキューの処理状態の詳細については並列タスクキューの処理状態または直列タスクキューの処理状態を参照してください。
コラム
- 並列タスクの場合、並列タスクキュー全体が停止します。
- 直列タスクの場合、対応する直列タスクキューのみにこのルールが適用されます。他の直列タスクキューには影響ありません。