サブスクリプションワークフローのチュートリアルのパート 4: アクティビティタスクポーラーの実装 - Amazon Simple Workflow Service

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

サブスクリプションワークフローのチュートリアルのパート 4: アクティビティタスクポーラーの実装

Amazon SWF で、ワークフロー実行を行うためのアクティビティタスクは、アクティビティタスクリストに表示されます。このリストは、ワークフローでアクティビティをスケジュールするときに表示されます。

ここでは、ワークフローでこれらのタスクを処理するための基本的なアクティビティポーラーを実装し、それを使用して、アクティビティを開始するために Amazon SWF がアクティビティタスクリストにタスクを配置したときにアクティビティを起動します。

開始するには、swf_sns_activities.rb という新しいファイルを作成します。これを使用して、以下のことを行います。

  • 作成したアクティビティクラスをインスタンス化する。

  • 各アクティビティを Amazon SWF に登録する。

  • アクティビティをポーリングし、アクティビティタスクリストに名前が表示されたら、各アクティビティに対して do_activity を呼び出す。

swf_sns_activities.rb で、次のステートメントを追加して、定義した各アクティビティクラスを要求する。

require_relative 'get_contact_activity.rb' require_relative 'subscribe_topic_activity.rb' require_relative 'wait_for_confirmation_activity.rb' require_relative 'send_result_activity.rb'

ここでクラスを作成し、初期化コードを指定します。

class ActivitiesPoller def initialize(domain, workflowId) @domain = domain @workflowId = workflowId @activities = {} # These are the activities we'll run activity_list = [ GetContactActivity, SubscribeTopicActivity, WaitForConfirmationActivity, SendResultActivity ] activity_list.each do | activity_class | activity_obj = activity_class.new puts "** initialized and registered activity: #{activity_obj.name}" # add it to the hash @activities[activity_obj.name.to_sym] = activity_obj end end

このコードは、ドメインおよびタスクリストで渡された情報を保存することに加えて、作成した各アクティビティクラスをインスタンス化します。各クラスは関連するアクティビティを登録するため (このコードを確認する必要がある場合は「basic_activity.rb」を参照してください)、これは実行するすべてのアクティビティについて Amazon SWF に知らせるために十分です。

インスタンス化した各アクティビティは、アクティビティ名 (get_contact_activity など) をキーとして使用してマップに保存し、次に定義するアクティビティポーラーコードで簡単に検索できるようにします。

poll_for_activities という新しいメソッドを作成し、ドメインが保持する activity_taskspoll を呼び出して、アクティビティタスクを取得します。

def poll_for_activities @domain.activity_tasks.poll(@workflowId) do | task | activity_name = task.activity_type.name

タスクの activity_type メンバーからアクティビティ名を取得できます。次に、このタスクと関連付けられたアクティビティ名を使用して、do_activity を実行するクラスを検索し、そのクラスにタスクを渡します (これには、アクティビティに転送される入力タスクが含まれます)。

# find the task on the activities list, and run it. if @activities.key?(activity_name.to_sym) activity = @activities[activity_name.to_sym] puts "** Starting activity task: #{activity_name}" if activity.do_activity(task) puts "++ Activity task completed: #{activity_name}" task.complete!({ :result => activity.results }) # if this is the final activity, stop polling. if activity_name == 'send_result_activity' return true end else puts "-- Activity task failed: #{activity_name}" task.fail!( { :reason => activity.results[:reason], :details => activity.results[:detail] } ) end else puts "couldn't find key in @activities list: #{activity_name}" puts "contents: #{@activities.keys}" end end end end

コードは do_activity​ が完了するのを待機したのち、リターンコードに基づいてタスクで complete!​ または fail!​ を呼び出します。

注記

このコードは、最終のアクティビティが起動されるとポーラーから終了します。これはミッションを完了し、すべてのアクティビティを起動したためです。独自の Amazon SWF コードでアクティビティを再度実行する場合、アクティビティポーラーの実行を無限に維持できます。

以上で ActivitiesPoller クラスのコードは終わりですが、ユーザーがコマンドラインから実行できるように、ファイルの末尾に少しコードを追加します。

if __FILE__ == $0 if ARGV.count < 1 puts "You must supply a task-list name to use!" exit end poller = ActivitiesPoller.new(init_domain, ARGV[0]) poller.poll_for_activities puts "All done!" end

ユーザーがコマンドラインからファイルを実行すると (最初の引数としてアクティビティタスクリストを渡す)、このコードはポーラークラスをインスタンス化し、アクティビティのポーリングを開始します。ポーラーが完了したら (最終のアクティビティの起動後)、メッセージを出力して終了します。

以上がアクティビティポーラーに関する説明です。後はコードを実行し、「サブスクリプションワークフローのチュートリアル: ワークフローの実行」でその動作を確認するだけです。