前回はREST APIのSignature生成とAPIコールの基本的なところを説明したので、今回は実際にSWFをApexから触ってみます!

SWFの概要説明のところで書いたとおり、SWFの全体的なフローは以下のようになります。
※エラーパターンを除いたシンプルな正常系フローです。

  1. Starterがワークフローをスタート&Decision Task(Decider用のタスク)のスケジュール
  2. DeciderがTaskListにポーリングしてタスクを取得
  3. 2のDeciderが過去のタスクの実行履歴を参照して、Activity Task(Activity Worker用のタスク)をスケジュール
  4. Activity WorkerがTaskListにポーリングしてタスクを取得
  5. 4のActivity Workerがタスク情報を参照して、タスクを実行し、Decision Taskをスケジュール
  6. 2~5を繰り返して、ワークフローを進める
  7. Deciderがワークフロー終了条件を満たしたと判断した場合、ワークフローを終了する

今回は1~3までをApexから操作してみます!

REST APIの詳しい説明はこちらから。

※ドメインとワークフロー・アクティビティタイプの登録は割愛します。詳細はこちら

1. ワークフローの開始(StartWorkflowExecution)

実行ActorはStarterになります。ワークフローを開始地点で、ここで設定した情報を元にワークフローが走ります。

Apexサンプルは以下のとおりで、前回作成したcallSWFAPIメソッドを使用しています。

 

■主要パラメータの説明

  • domain:AWSコンソールなどで登録したドメイン名を指定
  • input:ワークフローへの入力値。この値は後続のDecision TaskやActivity Taskに渡される。
  • taskList:Decision TaskのTask Listを指定。Decision TaskのTask Listはworkflow毎に1つのみ存在し、ここで指定した値(指定しなければデフォルト値)がworkflow実行中のDecision Task Listとなる。
  • workflowId:実行中のワークフロー内で一意に設定するworkflow毎のID値

レスポンスは以下のとおり

runIdはSWFが自動生成する一意な識別子になります。

2. Decision Taskの取得(PollForDecisionTask)

実行ActorはDeciderです。

Decision Task Listに投げられたDecision Taskを取得します。

■主要パラメータの説明

  • identity:どのDeciderが取得しようとしているかを明示する。ワークフロー履歴でTaskを取得したDeciderを特定するためのパラメータ。
  • taskList:取得先のDecision Task Listを指定。1と同じTask Listを設定すれば、1で投げたワークフローのDecision Taskを取得可能。

レスポンスはこんな感じ

■レスポンスの主要パラメータの説明

  • events:Workflowのこれまでの履歴(event)
  • workflowType:1で指定したworkflowType。
  • taskToken:タスクのやり取りに使用するトークン。これを使ってSWF⇔Decider、Worker間のタスクのやり取りを行う。

他にも色々とパラメータがありますが、基本的には履歴とワークフロータイプを見て、次のアクションを決めるというのがDeciderの仕事になります。

3. Activity Taskのスケジュール(RespondDecisionTaskCompleted)

実行ActorはDeciderです。

Decision Taskを受け取ったら、SWFに対して受け取りました!という通知とビジネスロジックに応じて、次に実行するActivity Taskをスケジュールします。

■主要パラメータの説明

  • decisions:Deciderが決定する次のタスクを指定。今回は次の処理の実行を意味する、”ActivityTaskの登録(ScheduleActivityTask)”を指定。
  • taskToken:2で取得したトークンを入力
  • decisionType:Decisionのタイプ。
  • activityId:タスクの一意な識別子。
  • activityType:事前に登録したActivityTypeを指定。Workerが次に実行するアクションを意味する。
  • taskList:Activity TaskのTask Listを指定。Activity Task Listは1つのワークフローに対して複数存在する。

これにより、ある特定のActivity Taskをある特定のWorkerに実行させることが出来て、局所的なスケールアウト・スケールアップが可能になります。1のDecision Task Listとは異なるので、同名を指定しても問題ありません。

成功時のレスポンスは空になります。

今回は、3の工程で次のActivity Taskを登録しましたが、WorkerにアサインされていないActivityTaskをキャンセルしたり(RequestCancelActivityTask)、ワークフローを終了させたり(FailWorkflowExecution, CompleteWorkflowExecution)、子ワークフローを開始させたり(StartChildWorkflowExecution)、Deciderは様々な方法でワークフローを制御することができます。

また、随所に出てきているtaskListパラメータは事前に登録するものではなく、実行時に名前を自由に指定して利用できるので、動的なTaskListの指定ができます。

ということで、次回はActivityTaskのポーリングからワークフロー終了までやります!