

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

# サブスクリプションワークフローのチュートリアルのパート 4: アクティビティタスクポーラーの実装
<a name="swf-sns-tutorial-implementing-activities-poller"></a>

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\_tasks](https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SimpleWorkflow/Domain.html#activity_tasks-instance_method) で [poll](https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SimpleWorkflow/ActivityTaskCollection.html#poll-instance_method) を呼び出して、アクティビティタスクを取得します。

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

タスクの [activity\_type](https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SimpleWorkflow/ActivityTask.html#activity_type-instance_method) メンバーからアクティビティ名を取得できます。次に、このタスクと関連付けられたアクティビティ名を使用して、`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\!](https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SimpleWorkflow/ActivityTask.html#complete!-instance_method)​ または [fail\!](https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SimpleWorkflow/ActivityTask.html#fail!-instance_method)​ を呼び出します。

**注記**  
このコードは、ミッションを完了し、すべてのアクティビティを起動したため、最終アクティビティが開始されるとポーラーから終了します。独自の 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
```

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

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