구독 워크플로 자습서 파트 4: 활동 작업 Poller 구현 - Amazon Simple Workflow Service

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

구독 워크플로 자습서 파트 4: 활동 작업 Poller 구현

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)을 키로 사용해 활동을 맵에 저장합니다. 따라서 다음에 정의할 활동 Poller 코드에서 해당 활동을 쉽게 찾을 수 있습니다.

poll_for_activities라는 새 메서드를 만들고 도메인이 보유하는 activity_tasks에 대해 폴링을 직접적으로 호출하여 활동 작업을 가져옵니다.

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 코드에서 활동을 다시 실행할 수 있는 경우 활동 Poller를 무기한으로 실행하도록 할 수 있습니다.

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

사용자가 명령줄에서 이 파일을 실행하면(이 파일을 작업 목록에 첫 번째 인수로 전달) 이 코드는 Poller 클래스를 인스턴스화하고 활동 폴링을 시작합니다. (Poller가 최종 활동을 시작한 후) Poller가 완료되면 메시지를 인쇄한 다음 종료합니다.

여기까지가 활동 Poller에 대한 내용입니다. 이제는 코드를 실행하고 구독 워크플로 자습서: 워크플로 실행에서 코드가 어떻게 작동하는지 관찰하기만 하면 됩니다.