翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
アクティビティタスクのキャンセルは、実行する必要がなくなったアクティビティを終了するようにディサイダーに通知します。Amazon SWF は協調的なキャンセルメカニズムを使用し、実行中のアクティビティタスクを強制的に中断することはありません。キャンセルのリクエストを処理するようにアクティビティワーカーをプログラムする必要があります。
ディサイダーは、決定タスクを処理中にアクティビティタスクをキャンセルする決定ができます。アクティビティタスクをキャンセルするには、ディサイダーは RespondDecisionTaskCompleted
アクションを RequestCancelActivityTask
決定とともに使用します。
アクティビティワーカーによってアクティビティタスクがまだ取得されていない場合、サービスはタスクをキャンセルします。アクティビティワーカーがいつでもタスクを取得できる競合状態が発生する可能性があることに注意してください。タスクがアクティビティワーカーに関連付けられている場合、アクティビティワーカーにはタスクのキャンセルがリクエストされます。
この例では、注文をキャンセルするためにワークフロー実行にシグナルが送信されます。
https://swf.us-east-1.amazonaws.com
SignalWorkflowExecution
{"domain": "867530901",
"workflowId": "20110927-T-1",
"runId": "9ba33198-4b18-4792-9c15-7181fb3a8852",
"signalName": "CancelOrder",
"input": "order 3553"}
ワークフロー実行がシグナルを受信した場合、Amazon SWF は次のような正常な HTTP レスポンスを返します。Amazon SWF はシグナルの処理をディサイダーに通知する決定タスクを生成します。
HTTP/1.1 200 OK
Content-Length: 0
Content-Type: application/json
x-amzn-RequestId: 6c0373ce-074c-11e1-9083-8318c48dee96
ディサイダーが決定タスクを処理し、履歴のシグナルを確認すると、ディサイダーは ShipOrderActivity0001
アクティビティ ID がある未処理のアクティビティのキャンセルを試みます。アクティビティタスクのスケジュールイベントから、ワークフロー履歴でアクティビティ ID が提供されます。
https://swf.us-east-1.amazonaws.com
RespondDecisionTaskCompleted
{
"taskToken":"12342e17-80f6-FAKE-TASK-TOKEN32f0223",
"decisions":[{
"decisionType":"RequestCancelActivityTask",
"RequestCancelActivityTaskDecisionAttributes":{
"ActivityID":"ShipOrderActivity0001"
}
}
]
}
Amazon SWF がキャンセルのリクエストを正常に受け取ると、次のような成功 HTTP レスポンスを返します。
HTTP/1.1 200 OK
Content-Length: 0
Content-Type: application/json
x-amzn-RequestId: 6c0373ce-074c-11e1-9083-8318c48dee96
キャンセルの試行は ActivityTaskCancelRequested
イベントとして履歴に記録されます。
ActivityTaskCanceled
イベントによって示されるようにタスクが正常にキャンセルされた場合、ワークフロー実行のクローズなど、タスクのキャンセルに続く適切なステップを実行するようにディサイダーをプログラムします。
タスクがキャンセルされずに完了、失敗、タイムアウトするなど、アクティビティタスクをキャンセルできなかった場合、ディサイダーはアクティビティの結果を受け入れるか、ユースケースで必要となるクリーンアップまたは軽減を実行する必要があります。
アクティビティタスクがアクティビティワーカーによって取得された場合、キャンセルのリクエストは、タスクのハートビートメカニズムを通して送信されます。アクティビティワーカーは定期的に RecordActivityTaskHeartbeat
を使用して、タスクがまだ進行中であることを Amazon SWF に報告できます。
アクティビティワーカーにハートビートは必要ありませんが、長時間実行されるタスクには推奨されます。タスクのキャンセルでは、定期的なハートビートを記録する必要があり、ワーカーがハートビートしない場合、タスクはキャンセルできません。
ディサイダーがタスクのキャンセルをリクエストする場合、Amazon SWF は cancelRequest
オブジェクトの値を true に設定します。cancelRequest
オブジェクトは、RecordActivityTaskHeartbeat
に応じてサービスによって返される ActivityTaskStatus
オブジェクトの一部です。
Amazon SWF によって、キャンセルがリクエストされたアクティビティタスクが正常に完了できなくなることはありません。キャンセルリクエストを処理する方法は、アクティビティによって決まります。要件に応じて、アクティビティタスクをキャンセルするか、キャンセルリクエストを無視するようにアクティビティワーカーをプログラムします。
アクティビティワーカーで、アクティビティタスクのワークがキャンセルされたことを示すには、RespondActivityTaskCanceled
で応答するようにプログラムします。アクティビティワーカーでタスクを完了する場合は、標準の RespondActivityTaskCompleted
で応答するようにプログラムします。
Amazon SWF が RespondActivityTaskCompleted
または RespondActivityTaskCanceled
リクエストを受け取ると、ワークフロー実行履歴を更新し、ディサイダーに通知するように決定タスクをスケジュールします。
決定タスクを処理し、追加の決定を返すようにディサイダーをプログラムします。アクティビティタスクが正常にキャンセルされた場合、続行するために必要なタスクを実行するか、ワークフロー実行をクローズするようにディサイダーをプログラムします。アクティビティタスクが正常にキャンセルされない場合は、結果を受け入れる、結果を無視する、または必要なクリーンアップをスケジュールするようにディサイダーをプログラムします。