Class: AWS::Flow::WorkflowWorker

Inherits:
GenericWorker show all
Defined in:
aws-flow-ruby/aws-flow/lib/aws/decider/worker.rb

Overview

This worker class is intended for use by the workflow implementation. It is configured with a task list and a workflow implementation. The worker class polls for decision tasks in the specified task list. When a decision task is received, it creates an instance of the workflow implementation and calls the @ execute() decorated method to process the task.

Instance Attribute Summary (collapse)

Instance Method Summary (collapse)

Methods inherited from GenericWorker

#resolve_default_task_list

Constructor Details

- (WorkflowWorker) initialize(service, domain, task_list, *args, &block)

Creates a new WorkflowWorker instance.

Parameters:

  • service

    The service used with this workflow worker.

  • domain (String)

    The Amazon SWF domain to operate on.

  • task_list (Array)

    The default task list to put all of the decision requests.

  • args

    The decisions to use.



130
131
132
133
134
135
136
137
138
139
140
# File 'aws-flow-ruby/aws-flow/lib/aws/decider/worker.rb', line 130

def initialize(service, domain, task_list, *args, &block)
  @workflow_definition_map = {}
  @workflow_type_options = []
  @options = Utilities::interpret_block_for_options(WorkerOptions, block)

  @logger = @options.logger if @options
  @logger ||= Utilities::LogFactory.make_logger(self)
  @options.logger ||= @logger if @options

  super(service, domain, task_list, *args)
end

Instance Attribute Details

- (Object) workflow_type

The workflow type for this workflow worker.



114
115
116
# File 'aws-flow-ruby/aws-flow/lib/aws/decider/worker.rb', line 114

def workflow_type
  @workflow_type
end

Instance Method Details

- (Object) add_implementation(workflow_class)



146
147
148
# File 'aws-flow-ruby/aws-flow/lib/aws/decider/worker.rb', line 146

def add_implementation(workflow_class)
  add_workflow_implementation(workflow_class)
end

- (Object) register

Registers this workflow with Amazon SWF.



189
190
191
192
193
194
195
196
197
198
199
200
# File 'aws-flow-ruby/aws-flow/lib/aws/decider/worker.rb', line 189

def register
  @workflow_type_options.delete_if {|workflow_type_options| workflow_type_options[:version].nil?}
  @workflow_type_options.each do |workflow_type_options|
    begin
      @service.register_workflow_type(workflow_type_options)
    rescue AWS::SimpleWorkflow::Errors::TypeAlreadyExistsFault => e
      @logger.warn "#{e.class} while trying to register workflow #{e.message} with options #{workflow_type_options}"
      # Purposefully eaten up, the alternative is to check first, and who
      # wants to do two trips when one will do?
    end
  end
end

- (Object) run_once(should_register = false, poller = nil)

Starts the workflow and runs it once, with an optional AWS::Flow::WorkflowTaskPoller.

Parameters:

  • poller (defaults to: nil)

    An optional AWS::Flow::WorkflowTaskPoller to use.

  • should_register (true, false) (defaults to: false)

    Indicates whether the workflow needs to be registered with Amazon SWF first. If #register was already called for this workflow worker, specify false.



241
242
243
244
245
246
247
248
249
250
251
252
253
254
# File 'aws-flow-ruby/aws-flow/lib/aws/decider/worker.rb', line 241

def run_once(should_register = false, poller = nil)
  register if should_register

  poller = WorkflowTaskPoller.new(
    @service,
    @domain,
    DecisionTaskHandler.new(@workflow_definition_map, @options),
    @task_list,
    @options
  ) if poller.nil?

  Kernel.exit if @shutting_down
  poller.poll_and_process_single_task
end

- (Object) set_workflow_implementation_types(workflow_implementation_types)



142
143
144
# File 'aws-flow-ruby/aws-flow/lib/aws/decider/worker.rb', line 142

def set_workflow_implementation_types(workflow_implementation_types)
  workflow_implementation_types.each {|type| add_workflow_implementation(type)}
end

- (Object) start(should_register = true)

Starts the workflow with a AWS::Flow::WorkflowTaskPoller.

Parameters:

  • should_register (true, false) (defaults to: true)

    Indicates whether the workflow needs to be registered with Amazon SWF first. If #register was already called for this workflow worker, specify false.



210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
# File 'aws-flow-ruby/aws-flow/lib/aws/decider/worker.rb', line 210

def start(should_register = true)
  # TODO check to make sure that the correct properties are set
  # TODO Register the domain if not already registered
  # TODO register types to poll
  # TODO Set up throttler
  # TODO Set up a timeout on the throttler correctly,
  # TODO Make this a generic poller, go to the right kind correctly

  poller = WorkflowTaskPoller.new(
    @service,
    @domain,
    DecisionTaskHandler.new(@workflow_definition_map, @options),
    @task_list,
    @options
  )

  register if should_register
  @logger.debug "Starting an infinite loop to poll and process workflow tasks."
  loop do
    run_once(false, poller)
  end
end