Amazon Simple Workflow Service アクティビティタスクのキャンセル - Amazon Simple Workflow Service

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon Simple Workflow Service アクティビティタスクのキャンセル

アクティビティタスクをキャンセルすると、ディサイダーはそれを実行する必要のないアクティビティを終了できます。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 リクエストを受け取ると、ワークフロー実行履歴を更新し、ディサイダーに通知するように決定タスクをスケジュールします。

決定タスクを処理し、追加の決定を返すようにディサイダーをプログラムします。アクティビティタスクが正常にキャンセルされた場合、続行するために必要なタスクを実行するか、ワークフロー実行をクローズするようにディサイダーをプログラムします。アクティビティタスクが正常にキャンセルされない場合は、結果を受け入れる、結果を無視する、または必要なクリーンアップをスケジュールするようにディサイダーをプログラムします。