前回はActivityTaskの登録までやったので、今回はワークフローの終了までやります!
※REST APIの基本的な部分は端折っているので、詳細な部分を知りたい方は過去記事をご参考ください!
4. Activity Taskの取得(PollForActivityTask)
実行ActorはWorkerになります。Activity TaskListに投げられたActivity Taskを取得します。
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を取得可能。
レスポンスは以下のとおり
{
"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がスケジュールされます。
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に対してワークフローの終了通知をします。
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に様々な通知をすることで、柔軟なワークフローを構成することができます。
次回は実際のフローとイベント登録に関して説明する予定です!