2014-02-22

ApexからSWFを触ってみる【ワークフローの終了まで】

前回は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に様々な通知をすることで、柔軟なワークフローを構成することができます。

 

次回は実際のフローとイベント登録に関して説明する予定です!

このエントリーをはてなブックマークに追加