前回はActivityTaskの登録までやったので、今回はワークフローの終了までやります!
※REST APIの基本的な部分は端折っているので、詳細な部分を知りたい方は過去記事をご参考ください!
4. Activity Taskの取得(PollForActivityTask)
実行ActorはWorkerになります。
Activity TaskListに投げられたActivity Taskを取得します。
1 2 3 4 5 6 7 8 9 10 11 12 |
public static String PollForActivityTask ( String domain, String identity, Map<String, String> taskList ) { String jsonBody = JSON.serialize(new Map<String, Object>{ 'domain' => domain, 'identity' => identity, 'taskList' => taskList }); return callSWFAPI('PollForActivityTask', jsonBody); } |
■主要パラメータの説明
identity
→どのWorkerが取得しようとしているかを明示する。ワークフロー履歴でTaskを取得したWorkerを特定するためのパラメータ。
taskList
→取得先のActivity TaskListを指定。3(ActivityTaskのスケジュール)と同じTask Listを設定すれば、
3で投げたワークフローのDecision Taskを取得可能。
レスポンスは以下のとおり
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{ "activityId": "20140222001", "activityType": { "name": "Step1", "version": "1.0" }, "input": "Test Message", "startedEventId": 6, "taskToken": "AAAAKgAAAAEAAAAAAAAAAvVSh6dDFC0ONKeUJ5V4YZk0vaDKdDleJM44ZuQLyH3himdckWB6mlfE1/h50XB+3s7dRrfohwBLbK5j3e98AbLaUUYvDP6DVv9VTu3AWZK/Yj4groIH8+0dZ92BDv343v//czgLxB4UBv2U4OiDvZLynDv9QXguiSIH6dK6QYF+Dbb6JGHs9taGOkIsreAFYrc4ytRCYhMNJnHb6TQpquPWKMNDHaltFbshHGamQACmF67eBGeonfkD1sk7ERZko00SUbeCY75fI5CFkKTCjS9Q7hRHukWapFVG9+dEKKJ1", "workflowExecution": { "runId": "12ZEh2TCxHYJmPaQoN8noi6wgOhyZ0XIhFxxeOdgdpiWI=", "workflowId": "20140222001" } } |
Decision Taskと違って、ワークフロー実行履歴は取得できませんが、
代わりにactivityTypeとinputパラメータ値からWorkerの動作を決めることができます。
taskTokenは5でSWFに通知する際に使用するトークンです。
5. Workerがタスクを実行し、DecisionTaskを登録(RespondActivityTaskCompleted)
実行ActorはWorkerになります。
4で取得したActivity Taskに応じてWorkerがタスクを実行し、完了後にSWFに通知をします。
これにより、次のDecision Taskがスケジュールされます。
1 2 3 4 5 6 7 8 9 10 |
public static String RespondActivityTaskCompleted ( String result, String taskToken ) { String jsonBody = JSON.serialize(new Map<String, Object>{ 'result' => result, 'taskToken' => taskToken }); return callSWFAPI('RespondActivityTaskCompleted', jsonBody); } |
■主要パラメータの説明
result
→タスクの処理結果を入力。この結果は後続のDeciderが参照可能。
taskToken
→4のレスポンスで取得したtaskTokenを入力。
レスポンスは空になります。
6. 2~5を繰り返して、ワークフローを進める
DeciderがDecisionTaskを取得
→DeciderがActivityTaskを登録
→WorkerがActivityTaskを取得
→WorkerがSWFにTask終了の通知
→SWFがDecisionTaskを登録
というフローを繰り返します。
7. Deciderがワークフロー終了条件を満たしたと判断した場合、ワークフローを終了する
実行ActorはDeciderになります。
DeciderはPollForDecisionTaskでタスクを取得後、SWFに対してワークフローの終了通知をします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
public static String CompleteWorkflowExecution ( String result, String executionContext, String taskToken ) { return RespondDecisionTaskCompleted( new List<Map<String, Object>> { new Map<String, Object> { 'decisionType' => 'CompleteWorkflowExecution', 'completeWorkflowExecutionDecisionAttributes' => new Map<String, Object> { 'result' => result } } }, executionContext, taskToken ); } public static String RespondDecisionTaskCompleted ( List<Map<String, Object>> decisions, String executionContext, String taskToken ) { String jsonBody = JSON.serialize(new Map<String, Object>{ 'decisions' => decisions, 'executionContext' => executionContext, 'taskToken' => taskToken }); return callSWFAPI('RespondDecisionTaskCompleted', jsonBody); } |
■主要パラメータの説明
decisionType
→Decisionの種別。ワークフローの終了通知なので”CompleteWorkflowExecution”を指定。
result
→SWFに通知する処理結果。
レスポンスは空になります。
今回は正常系フローの説明だったので5ではActivityTaskの完了通知をしていましたが、
ActivityTaskの失敗を通知したり(RespondActivityTaskFailed)
ActivityTaskの実行をキャンセルしたり(RespondActivityTaskCanceled)
Activity実行中であることを通知したり(RecordActivityTaskHeartbeat)
SWFに様々な通知をすることで、柔軟なワークフローを構成することができます。
次回は実際のフローとイベント登録に関して説明する予定です!
0 Comments
1 Pingback