aws-flow 2.0.1 → 2.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/aws-flow.gemspec +1 -1
- data/lib/aws/decider.rb +1 -1
- data/lib/aws/decider/activity.rb +7 -0
- data/lib/aws/decider/async_retrying_executor.rb +23 -8
- data/lib/aws/decider/decider.rb +1 -1
- data/lib/aws/decider/exceptions.rb +1 -0
- data/lib/aws/decider/flow_defaults.rb +57 -31
- data/lib/aws/decider/generic_client.rb +50 -22
- data/lib/aws/decider/options.rb +51 -14
- data/lib/aws/decider/task_poller.rb +8 -28
- data/lib/aws/decider/version.rb +1 -1
- data/lib/aws/runner.rb +127 -78
- data/spec/aws/decider/integration/integration_spec.rb +1 -1
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
OTZjNzcwMDhjZjc5MzZlNjZjOTlmZDgxYjQzMmNlZmVkOWE1YTFhZA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NzNhZDZlZmI5Y2JiMGU1OTY2NjEwNGIzZDEwZTJjNDAyYTVhMmVkNQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
N2U0N2RjOWIzYWExM2JmMzI2ZDc2NjgyNzNmNjA0OThlZjcyNGM2YTQwNDEy
|
10
|
+
NTg5ZTVlZTU3MmYwMjU5NzA3NzgyNzUwOWE2ZGMwNmU1YzE1MWE1Njk3MjBh
|
11
|
+
ODBjM2I5NjMyNWM5MGExYWE2NjdiMGM5MjA5NTQ2YTY1OGZiZTQ=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ODFiYmQyY2NmNTA0MTg0OGIzOGI0Y2Q5ZTUyZmVjNWE1ZTBhMDI5MzQ1OThl
|
14
|
+
NDNjNDhhN2U2ODNjYWU1ZGQ1MTM2NDkyNDJjNDlhYmEzYTcwNzFlOWQzOGQ0
|
15
|
+
ZDg5NTMzYmI2OWE4NmExMTEzZjZjMzA4ZTVhZTBmM2MxZjk4MmE=
|
data/aws-flow.gemspec
CHANGED
@@ -13,5 +13,5 @@ Gem::Specification.new do |s|
|
|
13
13
|
s.files = `git ls-files`.split("\n").reject {|file| file =~ /aws-flow-core/}
|
14
14
|
s.require_paths << "lib/aws/"
|
15
15
|
s.required_ruby_version = ">= 1.9.1"
|
16
|
-
s.add_dependency "aws-sdk", "~> 1", ">= 1.39.0"
|
16
|
+
s.add_dependency "aws-sdk-v1", "~> 1", ">= 1.39.0"
|
17
17
|
end
|
data/lib/aws/decider.rb
CHANGED
data/lib/aws/decider/activity.rb
CHANGED
@@ -313,9 +313,14 @@ module AWS
|
|
313
313
|
end
|
314
314
|
|
315
315
|
# Represents an activity client.
|
316
|
+
# @api private
|
316
317
|
class ActivityClient
|
318
|
+
# TODO -- Is this class used anywhere? It might be helpful to remove it,
|
319
|
+
# if it is not. Most of its functionality seems to be implemented in the
|
320
|
+
# GenericClient and GenericActivityClient classes.
|
317
321
|
|
318
322
|
# Gets the data converter for the activity client.
|
323
|
+
# @api private
|
319
324
|
def data_converter
|
320
325
|
@generic_client.data_converter
|
321
326
|
end
|
@@ -325,6 +330,7 @@ module AWS
|
|
325
330
|
# @param other
|
326
331
|
# The data converter to set.
|
327
332
|
#
|
333
|
+
# @api private
|
328
334
|
def data_converter=(other)
|
329
335
|
@generic_client.data_converter = other
|
330
336
|
end
|
@@ -337,6 +343,7 @@ module AWS
|
|
337
343
|
# @param [ExponentialRetryOptions] block
|
338
344
|
# A hash of {ExponentialRetryOptions} to use.
|
339
345
|
#
|
346
|
+
# @api private
|
340
347
|
def exponential_retry(method_name, &block)
|
341
348
|
@generic_client.retry(method_name, lambda {|first, time_of_failure, attempts| 1}, block)
|
342
349
|
end
|
@@ -16,13 +16,18 @@
|
|
16
16
|
module AWS
|
17
17
|
module Flow
|
18
18
|
|
19
|
+
# internal AsyncRetryingExecutor class
|
20
|
+
# @api private
|
19
21
|
class AsyncRetryingExecutor
|
22
|
+
# @api private
|
20
23
|
def initialize(retrying_policy, clock, execution_id, return_on_start = false)
|
21
24
|
@retrying_policy = retrying_policy
|
22
25
|
@clock = clock
|
23
26
|
@return_on_start = return_on_start
|
24
27
|
@execution_id = execution_id
|
25
28
|
end
|
29
|
+
|
30
|
+
# @api private
|
26
31
|
def execute(command, options = nil)
|
27
32
|
return schedule_with_retry(command, nil, Hash.new { |hash, key| hash[key] = 1 }, @clock.current_time, nil) if @return_on_start
|
28
33
|
output = Utilities::AddressableFuture.new
|
@@ -44,6 +49,7 @@ module AWS
|
|
44
49
|
output
|
45
50
|
end
|
46
51
|
|
52
|
+
# @api private
|
47
53
|
def schedule_with_retry(command, failure, attempts, first_attempt_time, time_of_recorded_failure)
|
48
54
|
delay = -1
|
49
55
|
if attempts.values.reduce(0, :+) > 1
|
@@ -60,6 +66,7 @@ module AWS
|
|
60
66
|
end
|
61
67
|
end
|
62
68
|
|
69
|
+
# @api private
|
63
70
|
def invoke(command, attempts, first_attempt_time)
|
64
71
|
failure_to_retry = nil
|
65
72
|
should_retry = Future.new
|
@@ -86,7 +93,6 @@ module AWS
|
|
86
93
|
return output if @return_on_start
|
87
94
|
output.get
|
88
95
|
end
|
89
|
-
|
90
96
|
end
|
91
97
|
|
92
98
|
# Represents a policy for retrying failed tasks.
|
@@ -95,10 +101,10 @@ module AWS
|
|
95
101
|
# Creates a new `RetryPolicy` instance.
|
96
102
|
#
|
97
103
|
# @param retry_function
|
98
|
-
# The method
|
104
|
+
# The method that will be called for each retry attempt.
|
99
105
|
#
|
100
106
|
# @param options
|
101
|
-
# A set of {RetryOptions} to modify the retry behavior.
|
107
|
+
# A set of {RetryOptions} used to modify the retry behavior.
|
102
108
|
#
|
103
109
|
def initialize(retry_function, options)
|
104
110
|
@retry_function = retry_function
|
@@ -115,7 +121,8 @@ module AWS
|
|
115
121
|
# The failure to test.
|
116
122
|
#
|
117
123
|
# @return [true, false]
|
118
|
-
# Returns `true` if the task can be retried for this failure
|
124
|
+
# Returns `true` if the task can be retried for this failure; `false`
|
125
|
+
# otherwise.
|
119
126
|
#
|
120
127
|
def isRetryable(failure)
|
121
128
|
if failure.respond_to? :cause
|
@@ -126,23 +133,31 @@ module AWS
|
|
126
133
|
|
127
134
|
return true if @exceptions_to_exclude.empty? && @exceptions_to_include.empty?
|
128
135
|
raise "#{failure} appears in both exceptions_to_include and exceptions_to_exclude" if @exceptions_to_exclude.include?(failure_class) && @exceptions_to_include.include?(failure_class)
|
129
|
-
# In short, default to false
|
130
|
-
#
|
131
|
-
# failure exists in
|
136
|
+
# In short, default to false.
|
137
|
+
# The second part of the statement does an intersection of the 2 arrays
|
138
|
+
# to see if any of the ancestors of failure exists in
|
139
|
+
# @exceptions_to_include
|
132
140
|
return (!@exceptions_to_exclude.include?(failure_class) && !(@exceptions_to_include & failure_class.ancestors).empty?)
|
133
141
|
|
134
142
|
#return (!@exceptions_to_exclude.include?(failure) && @exceptions_to_include.include?(failure))
|
135
143
|
end
|
136
144
|
|
137
|
-
# Schedules a new retry attempt.
|
145
|
+
# Schedules a new retry attempt with an initial delay.
|
138
146
|
#
|
139
147
|
# @param first_attempt
|
148
|
+
# The time to delay before the first retry attempt is made.
|
140
149
|
#
|
141
150
|
# @param time_of_recorded_failure
|
142
151
|
#
|
143
152
|
# @param attempts
|
153
|
+
# The number of retry attempts to make before the task is considered to
|
154
|
+
# be failed.
|
144
155
|
#
|
145
156
|
# @param failure
|
157
|
+
# The type of failure to retry. If not specified, then all types of
|
158
|
+
# failures will be retried.
|
159
|
+
#
|
160
|
+
# @param execution_id
|
146
161
|
#
|
147
162
|
def next_retry_delay_seconds(first_attempt, time_of_recorded_failure, attempts, failure = nil, execution_id)
|
148
163
|
if attempts.values.reduce(0, :+) < 2
|
data/lib/aws/decider/decider.rb
CHANGED
@@ -335,7 +335,7 @@ module AWS
|
|
335
335
|
# The entry points (methods) that starts the workflow.
|
336
336
|
#
|
337
337
|
# @param block
|
338
|
-
# A block of {
|
338
|
+
# A block of {WorkflowRegistrationOptions} for the workflow.
|
339
339
|
#
|
340
340
|
def workflow(*workflow_names, &block)
|
341
341
|
workflow_names.each do |workflow_name|
|
@@ -18,51 +18,77 @@ module AWS
|
|
18
18
|
|
19
19
|
# Constants used by the AWS Flow Framework for Ruby.
|
20
20
|
#
|
21
|
-
# @!attribute
|
22
|
-
# The
|
21
|
+
# @!attribute [r] default_data_converter
|
22
|
+
# The DataConverter used to interpret results from Amazon SWF.
|
23
23
|
#
|
24
|
-
#
|
24
|
+
# @return [Object] {YAMLDataConverter}
|
25
25
|
#
|
26
|
-
# @!attribute
|
27
|
-
# The
|
28
|
-
#
|
26
|
+
# @!attribute [r] exponential_retry_backoff_coefficient
|
27
|
+
# The coefficient used to determine how much to back off the interval
|
28
|
+
# timing for an exponential retry scenario.
|
29
29
|
#
|
30
|
-
#
|
30
|
+
# @return [Float] `2.0` (each retry takes twice as long as the previous
|
31
|
+
# attempt)
|
31
32
|
#
|
32
|
-
# @!attribute
|
33
|
+
# @!attribute [r] exponential_retry_exceptions_to_exclude
|
34
|
+
# A list of the exception types to exclude from initiating retry attempts.
|
33
35
|
#
|
34
|
-
#
|
35
|
-
# timing for an exponential retry scenario. The default value, `2.0`,
|
36
|
-
# causes each retry attempt to wait twice as long as the previous attempt.
|
36
|
+
# @return [Array<Object>] an empty list. No exceptions are excluded.
|
37
37
|
#
|
38
|
-
# @!attribute
|
39
|
-
#
|
40
|
-
# failed task. The default value is `Float::INFINITY`, which indicates
|
41
|
-
# that there should be *no* limit to the number of retry attempts.
|
38
|
+
# @!attribute [r] exponential_retry_exceptions_to_include
|
39
|
+
# A list of the exception types to include for initiating retry attempts.
|
42
40
|
#
|
43
|
-
#
|
41
|
+
# @return [Array<Class>] `Exception` (all exceptions are included)
|
42
|
+
#
|
43
|
+
# @!attribute [r] exponential_retry_function
|
44
44
|
# The default exponential retry function.
|
45
45
|
#
|
46
|
-
#
|
47
|
-
#
|
48
|
-
#
|
46
|
+
# @return A *lambda* that takes four parameters: an initial time, a time
|
47
|
+
# of failure, a number of attempts, and a set of
|
48
|
+
# {ExponentialRetryOptions}.
|
49
49
|
#
|
50
|
-
# @!attribute
|
51
|
-
#
|
52
|
-
# By default, all exceptions are included (the default value is
|
53
|
-
# `Exception`, which is the base class for all exceptions.)
|
50
|
+
# @!attribute [r] exponential_retry_initial_retry_interval
|
51
|
+
# The initial retry interval.
|
54
52
|
#
|
55
|
-
#
|
56
|
-
#
|
57
|
-
#
|
53
|
+
# @return [Fixnum] `2`
|
54
|
+
#
|
55
|
+
# @!attribute [r] exponential_retry_maximum_attempts
|
56
|
+
# The maximum number of attempts to make for an exponential retry of a
|
57
|
+
# failed task.
|
58
58
|
#
|
59
|
-
#
|
59
|
+
# @return [Float] `Float::INFINITY` (there is no limit to the number of
|
60
|
+
# retry attempts)
|
61
|
+
#
|
62
|
+
# @!attribute [r] exponential_retry_maximum_retry_interval_seconds
|
63
|
+
# The maximum interval that can pass, in seconds, before a retry occurs.
|
64
|
+
#
|
65
|
+
# @return [Fixnum] `-1` (no maximum)
|
66
|
+
#
|
67
|
+
# @!attribute [r] exponential_retry_retry_expiration_seconds
|
68
|
+
# The maximum time that can pass, in seconds, before an exponential retry
|
69
|
+
# attempt is considered to be a failure.
|
70
|
+
#
|
71
|
+
# @return [Fixnum] `-1` (no expiration for a retry attempt)
|
72
|
+
#
|
73
|
+
# @!attribute [r] jitter_function
|
60
74
|
# The function that is used to determine how long to wait for the next
|
61
|
-
#
|
75
|
+
# retry attempt when *should_jitter* is set to `true`.
|
76
|
+
#
|
77
|
+
# @return a *lambda* that takes a random number seed and a maximum value
|
78
|
+
# (must be > 0).
|
79
|
+
#
|
80
|
+
# @!attribute [r] should_jitter
|
81
|
+
# Indicates whether there should be any randomness built in to the timing
|
82
|
+
# of the retry attempt.
|
83
|
+
#
|
84
|
+
# @return [Boolean] `true`
|
85
|
+
#
|
86
|
+
# @!attribute [r] use_worker_task_list
|
87
|
+
# Used with activity and workflow options. Indicates that the activity
|
88
|
+
# and/or workflow should use the same task list that the associated
|
89
|
+
# worker is polling on.
|
62
90
|
#
|
63
|
-
#
|
64
|
-
# Indicates whether there should be any randomness built in to the timing of
|
65
|
-
# the retry attempt. The default value is `true`.
|
91
|
+
# @return [String] "USE_WORKER_TASK_LIST"
|
66
92
|
#
|
67
93
|
class FlowConstants
|
68
94
|
|
@@ -16,7 +16,8 @@
|
|
16
16
|
module AWS
|
17
17
|
module Flow
|
18
18
|
|
19
|
-
# A generic activity client.
|
19
|
+
# A generic activity client. This class is not usually used directly; it
|
20
|
+
# serves as the base class for both activity and workflow client classes.
|
20
21
|
class GenericClient
|
21
22
|
|
22
23
|
# The option map for the client.
|
@@ -27,11 +28,14 @@ module AWS
|
|
27
28
|
@option_map = {}
|
28
29
|
end
|
29
30
|
|
30
|
-
|
31
|
-
#
|
31
|
+
# Creates a new client that is a copy of this client instance, modified by
|
32
|
+
# a hash of passed-in options.
|
32
33
|
#
|
33
34
|
# @param opts
|
34
|
-
# The options to set.
|
35
|
+
# The options to set on the new client. Any options that are not set
|
36
|
+
# here are copied from the original client.
|
37
|
+
#
|
38
|
+
# @return [GenericClient] A new client instance.
|
35
39
|
#
|
36
40
|
def with_opts(opts = {})
|
37
41
|
modified_instance = self.dup
|
@@ -41,6 +45,16 @@ module AWS
|
|
41
45
|
modified_instance
|
42
46
|
end
|
43
47
|
|
48
|
+
# Reconfigures an activity client with a block of passed-in options.
|
49
|
+
#
|
50
|
+
# @note This functionality is limited to activity clients only.
|
51
|
+
#
|
52
|
+
# @param method_names
|
53
|
+
# The activity methods to modify with the options passed in.
|
54
|
+
#
|
55
|
+
# @param block
|
56
|
+
# A block of {ActivityOptions} to use to reconfigure the client.
|
57
|
+
#
|
44
58
|
def reconfigure(*method_names, &block)
|
45
59
|
options = Utilities::interpret_block_for_options(self.class.default_option_class, block)
|
46
60
|
method_names.each { |method_name| @option_map[method_name.to_sym] = options }
|
@@ -51,17 +65,18 @@ module AWS
|
|
51
65
|
raise "You cannot use this function outside of a workflow definition" if Utilities::is_external
|
52
66
|
end
|
53
67
|
|
54
|
-
|
55
|
-
#
|
56
|
-
# complete.
|
68
|
+
# Starts an asynchronous execution of a task. This method returns
|
69
|
+
# immediately; it does not wait for the task to complete.
|
57
70
|
#
|
58
|
-
# @note Trying to use {#send_async} outside of a workflow will fail with
|
71
|
+
# @note Trying to use {#send_async} outside of a workflow will fail with
|
72
|
+
# an exception.
|
59
73
|
#
|
60
74
|
# @param task The task to execute.
|
61
75
|
#
|
62
76
|
# @param args A number of arguments used to start the task execution.
|
63
77
|
#
|
64
|
-
# @param block
|
78
|
+
# @param block
|
79
|
+
# A code block with additional options to start the task execution.
|
65
80
|
#
|
66
81
|
# @example The following two calls are equivalent.
|
67
82
|
# foo.send_async :bar # plus args and block if appropriate
|
@@ -75,7 +90,8 @@ module AWS
|
|
75
90
|
# If there is no block, just make a block for immediate return.
|
76
91
|
if block.nil?
|
77
92
|
modified_options = Proc.new{ {:return_on_start => true } }
|
78
|
-
# If there is a block, and it doesn't take any arguments, it will
|
93
|
+
# If there is a block, and it doesn't take any arguments, it will
|
94
|
+
# evaluate to a hash. Add an option to the hash.
|
79
95
|
elsif block.arity == 0
|
80
96
|
modified_options = Proc.new do
|
81
97
|
result = block.call
|
@@ -99,16 +115,25 @@ module AWS
|
|
99
115
|
self.send(task, *args, &modified_options)
|
100
116
|
end
|
101
117
|
|
102
|
-
|
103
118
|
# Retries the given method using an exponential fallback function.
|
119
|
+
#
|
120
|
+
# @param method_name
|
121
|
+
# The method to retry.
|
122
|
+
#
|
123
|
+
# @param args
|
124
|
+
# Arguments (parameters) that are passed to the method specified in
|
125
|
+
# *method_name*.
|
126
|
+
#
|
127
|
+
# @param block
|
128
|
+
# A block of {RetryOptions} used to specify retry behavior.
|
129
|
+
#
|
104
130
|
def exponential_retry(method_name, *args, &block)
|
105
131
|
future = self._retry(method_name, FlowConstants.exponential_retry_function, block, args)
|
106
132
|
Utilities::drill_on_future(future)
|
107
133
|
end
|
108
134
|
|
109
|
-
|
110
|
-
|
111
135
|
# Used by {#retry}
|
136
|
+
#
|
112
137
|
# @api private
|
113
138
|
def _retry_with_options(lambda_to_execute, retry_function, retry_options, args = NoInput.new)
|
114
139
|
retry_policy = RetryPolicy.new(retry_function, retry_options)
|
@@ -137,7 +162,6 @@ module AWS
|
|
137
162
|
return output.get
|
138
163
|
end
|
139
164
|
|
140
|
-
|
141
165
|
# Retries the given method using an optional retry function and block of {RetryOptions}.
|
142
166
|
#
|
143
167
|
# @param (see #retry)
|
@@ -149,20 +173,22 @@ module AWS
|
|
149
173
|
_retry_with_options(lambda { self.send(method_name, *args) }, retry_function, retry_options)
|
150
174
|
end
|
151
175
|
|
152
|
-
|
153
|
-
#
|
176
|
+
# Retries the given method using an optional retry function and block of
|
177
|
+
# {RetryOptions}.
|
154
178
|
#
|
155
179
|
# @param method_name
|
156
|
-
# The
|
180
|
+
# The method to retry.
|
157
181
|
#
|
158
182
|
# @param retry_function
|
159
|
-
# The
|
183
|
+
# The function to use in order to determine if a retry should be
|
184
|
+
# attempted.
|
160
185
|
#
|
161
186
|
# @param args
|
162
|
-
# Arguments to send to the method
|
187
|
+
# Arguments to send to the method provided in the *method_name*
|
188
|
+
# parameter.
|
163
189
|
#
|
164
190
|
# @param block
|
165
|
-
#
|
191
|
+
# A block of {RetryOptions} used to specify retry behavior.
|
166
192
|
#
|
167
193
|
def retry(method_name, retry_function, *args, &block)
|
168
194
|
if retry_function.is_a? Fixnum
|
@@ -173,8 +199,10 @@ module AWS
|
|
173
199
|
Utilities::drill_on_future(future)
|
174
200
|
end
|
175
201
|
|
176
|
-
|
177
|
-
#
|
202
|
+
# Returns the decision context for this client.
|
203
|
+
#
|
204
|
+
# @return The decision context.
|
205
|
+
#
|
178
206
|
def decision_context
|
179
207
|
FlowFiber.current[:decision_context]
|
180
208
|
end
|
data/lib/aws/decider/options.rb
CHANGED
@@ -58,7 +58,7 @@ module AWS
|
|
58
58
|
# class, and returns the result.
|
59
59
|
#
|
60
60
|
# @return [Hash]
|
61
|
-
# The merged set of options,
|
61
|
+
# The merged set of options, returned as a hash.
|
62
62
|
#
|
63
63
|
# @param [Options] options
|
64
64
|
# An {Options}-derived class containing a set of options to use if this
|
@@ -116,8 +116,10 @@ module AWS
|
|
116
116
|
class WorkerDefaults < Defaults
|
117
117
|
|
118
118
|
# Whether to use Ruby's `fork` for launching new workers. The default is
|
119
|
-
# `true`.
|
120
|
-
#
|
119
|
+
# `true`.
|
120
|
+
#
|
121
|
+
# On Windows, you should override this default value and set `use_forking`
|
122
|
+
# to `false`. See {WorkerOptions} for more information.
|
121
123
|
#
|
122
124
|
# @return [Boolean]
|
123
125
|
# Returns `true`.
|
@@ -139,9 +141,13 @@ module AWS
|
|
139
141
|
# Whether to use Ruby's `fork` for launching new workers. The default is
|
140
142
|
# `true`.
|
141
143
|
#
|
142
|
-
# On Windows,
|
143
|
-
#
|
144
|
-
#
|
144
|
+
# On Windows, `use_forking` should generally be set to `false`:
|
145
|
+
#
|
146
|
+
# AWS::Flow::ActivityWorker.new(
|
147
|
+
# @domain.client, @domain, ACTIVITY_TASKLIST, klass) { { use_forking: false } }
|
148
|
+
#
|
149
|
+
# For more information, see
|
150
|
+
# [Important Notes](http://docs.aws.amazon.com/amazonswf/latest/awsrbflowguide/welcome.html#forking-windows-note)
|
145
151
|
# in the *AWS Flow Framework for Ruby Developer Guide*.
|
146
152
|
#
|
147
153
|
class WorkerOptions < Options
|
@@ -195,23 +201,40 @@ module AWS
|
|
195
201
|
|
196
202
|
# The default maximum number of attempts to make before the task is
|
197
203
|
# marked as failed.
|
204
|
+
#
|
205
|
+
# @see FlowConstants.exponential_retry_maximum_attempts
|
198
206
|
def maximum_attempts; FlowConstants.exponential_retry_maximum_attempts; end
|
199
207
|
|
200
208
|
# The default retry function to use.
|
209
|
+
#
|
210
|
+
# @see FlowConstants.exponential_retry_function
|
201
211
|
def retry_function; FlowConstants.exponential_retry_function; end
|
202
212
|
|
203
213
|
# The exceptions that will initiate a retry attempt. The default is to
|
204
214
|
# use *all* exceptions.
|
215
|
+
#
|
216
|
+
# @see FlowConstants.exponential_retry_exceptions_to_include
|
205
217
|
def exceptions_to_include; FlowConstants.exponential_retry_exceptions_to_include; end
|
206
218
|
|
207
219
|
# The exceptions that will *not* initiate a retry attempt. The default is
|
208
220
|
# an empty list; no exceptions are excluded.
|
221
|
+
#
|
222
|
+
# @see FlowConstants.exponential_retry_exceptions_to_exclude
|
209
223
|
def exceptions_to_exclude; FlowConstants.exponential_retry_exceptions_to_exclude; end
|
210
224
|
|
225
|
+
# Sets the backoff coefficient to use for retry attempts.
|
226
|
+
#
|
227
|
+
# @see FlowConstants.exponential_retry_backoff_coefficient
|
211
228
|
def backoff_coefficient; FlowConstants.exponential_retry_backoff_coefficient; end
|
212
229
|
|
230
|
+
# @desc (see FlowConstants#should_jitter)
|
231
|
+
# @return the value of {FlowConstants#should_jitter}
|
213
232
|
def should_jitter; FlowConstants.should_jitter; end
|
233
|
+
|
234
|
+
# @see FlowConstants.jitter_function
|
214
235
|
def jitter_function; FlowConstants.jitter_function; end
|
236
|
+
|
237
|
+
# @see FlowConstants.exponential_retry_initial_retry_interval
|
215
238
|
def initial_retry_interval; FlowConstants.exponential_retry_initial_retry_interval; end
|
216
239
|
end
|
217
240
|
|
@@ -263,14 +286,15 @@ module AWS
|
|
263
286
|
# The retry function to use.
|
264
287
|
#
|
265
288
|
# @param [true, false] use_defaults
|
266
|
-
# If set to `true`, the default options specified will be used as the
|
289
|
+
# If set to `true`, the default options specified will be used as the
|
290
|
+
# runtime options.
|
267
291
|
#
|
268
292
|
def initialize(hash={}, use_defaults=false)
|
269
293
|
super(hash, use_defaults)
|
270
294
|
end
|
271
295
|
|
272
|
-
# Tests whether this activity can be retried based on the
|
273
|
-
#
|
296
|
+
# Tests whether this activity can be retried based on the
|
297
|
+
# `exceptions_to_retry` and `exceptions_to_exclude` options.
|
274
298
|
#
|
275
299
|
# @param [Object] failure
|
276
300
|
# The failure type to test.
|
@@ -351,10 +375,12 @@ module AWS
|
|
351
375
|
# The supported child policies are:
|
352
376
|
#
|
353
377
|
# * `TERMINATE`: the child executions will be terminated.
|
378
|
+
#
|
354
379
|
# * `REQUEST_CANCEL`: a request to cancel will be attempted for each child
|
355
|
-
#
|
356
|
-
#
|
357
|
-
#
|
380
|
+
# execution by recording a `WorkflowExecutionCancelRequested` event in its
|
381
|
+
# history. It is up to the decider to take appropriate actions when it
|
382
|
+
# receives an execution history with this event.
|
383
|
+
#
|
358
384
|
# * `ABANDON`: no action will be taken. The child executions will continue
|
359
385
|
# to run.
|
360
386
|
#
|
@@ -460,7 +486,7 @@ module AWS
|
|
460
486
|
class WorkflowRegistrationOptions < WorkflowOptions
|
461
487
|
class << self
|
462
488
|
def registration_options
|
463
|
-
[
|
489
|
+
[
|
464
490
|
:default_task_start_to_close_timeout,
|
465
491
|
:default_execution_start_to_close_timeout,
|
466
492
|
:default_task_list,
|
@@ -710,6 +736,7 @@ module AWS
|
|
710
736
|
@_exponential_retry = retry_options
|
711
737
|
end
|
712
738
|
|
739
|
+
# Return the full set of options for the Activity.
|
713
740
|
def get_full_options
|
714
741
|
result = {}
|
715
742
|
usable_properties = self.class.held_properties
|
@@ -725,6 +752,14 @@ module AWS
|
|
725
752
|
# This class is used to capture the options passed during activity declaration.
|
726
753
|
class ActivityRegistrationOptions < ActivityOptions
|
727
754
|
class << self
|
755
|
+
# Default registration options. These can be set only during Activity
|
756
|
+
# registration.
|
757
|
+
#
|
758
|
+
# * `default_task_heartbeat_timeout`
|
759
|
+
# * `default_task_schedule_to_close_timeout`
|
760
|
+
# * `default_task_schedule_to_start_timeout`
|
761
|
+
# * `default_task_start_to_close_timeout`
|
762
|
+
#
|
728
763
|
def registration_options
|
729
764
|
[
|
730
765
|
:default_task_heartbeat_timeout,
|
@@ -747,6 +782,7 @@ module AWS
|
|
747
782
|
|
748
783
|
default_classes << ActivityRegistrationDefaults.new
|
749
784
|
|
785
|
+
# Return the options for this Activity that are set during registration.
|
750
786
|
def get_registration_options
|
751
787
|
get_options(self.class.registration_options)
|
752
788
|
end
|
@@ -763,7 +799,8 @@ module AWS
|
|
763
799
|
# options in this class.
|
764
800
|
#
|
765
801
|
# @param [true, false] use_defaults
|
766
|
-
# Set to `true` to use the default runtime options for the activity.
|
802
|
+
# Set to `true` to use the default runtime options for the activity. The
|
803
|
+
# default is `false`.
|
767
804
|
#
|
768
805
|
def initialize(default_options = {}, use_defaults=false)
|
769
806
|
super(default_options, use_defaults)
|
@@ -20,7 +20,6 @@ module AWS
|
|
20
20
|
|
21
21
|
class WorkflowTaskPoller
|
22
22
|
|
23
|
-
|
24
23
|
# Creates a new `WorkflowTaskPoller`.
|
25
24
|
#
|
26
25
|
# @param service
|
@@ -47,8 +46,6 @@ module AWS
|
|
47
46
|
@logger ||= Utilities::LogFactory.make_logger(self)
|
48
47
|
end
|
49
48
|
|
50
|
-
|
51
|
-
|
52
49
|
# @api private
|
53
50
|
# Retrieves any decision tasks that are ready.
|
54
51
|
def get_decision_task
|
@@ -176,21 +173,7 @@ module AWS
|
|
176
173
|
# @note Retry behavior for this method is currently *not implemented*. For
|
177
174
|
# now, it simply wraps {#respond_activity_task_failed}.
|
178
175
|
#
|
179
|
-
# @
|
180
|
-
# *Required*. The task token from the {ActivityDefinition} object to
|
181
|
-
# retry. The task token is generated by the service and should be
|
182
|
-
# treated as an opaque value.
|
183
|
-
#
|
184
|
-
# @param reason
|
185
|
-
# *Required*. Description of the error that may assist in diagnostics.
|
186
|
-
# Although this value is *required*, you can set it to an empty string
|
187
|
-
# if you don't need this information.
|
188
|
-
#
|
189
|
-
# @param details
|
190
|
-
# *Required*. Detailed information about the failure. Although this
|
191
|
-
# value is *required*, you can set it to an empty string if you don't
|
192
|
-
# need this information.
|
193
|
-
#
|
176
|
+
# @api private
|
194
177
|
def respond_activity_task_failed_with_retry(task_token, reason, details)
|
195
178
|
#TODO Set up this variable
|
196
179
|
if @failure_retrier.nil?
|
@@ -205,14 +188,7 @@ module AWS
|
|
205
188
|
# @note Retry behavior for this method is currently *not implemented*. For
|
206
189
|
# now, it simply wraps {#respond_activity_task_canceled}.
|
207
190
|
#
|
208
|
-
# @
|
209
|
-
# *Required*. The task token from the {ActivityDefinition} object to
|
210
|
-
# retry.
|
211
|
-
#
|
212
|
-
# @param message
|
213
|
-
# *Required*. A message that provides detail about why the activity task
|
214
|
-
# is cancelled.
|
215
|
-
#
|
191
|
+
# @api private
|
216
192
|
def respond_activity_task_canceled_with_retry(task_token, message)
|
217
193
|
if @failure_retrier.nil?
|
218
194
|
respond_activity_task_canceled(task_token, message)
|
@@ -270,10 +246,11 @@ module AWS
|
|
270
246
|
# We are using the 'build' method to create a new ConnectionPool here to
|
271
247
|
# make sure that connection pools are not shared among forked processes.
|
272
248
|
# The default behavior of the ConnectionPool class is to cache a pool
|
273
|
-
# for a set of options created by the 'new' method and always use the
|
249
|
+
# for a set of options created by the 'new' method and always use the
|
274
250
|
# same pool for the same set of options. This is undesirable when
|
275
251
|
# multiple processes want to use different connection pools with same
|
276
252
|
# options as is the case here.
|
253
|
+
#
|
277
254
|
# Since we can't change the pool of an already existing NetHttpHandler,
|
278
255
|
# we also create a new NetHttpHandler in order to use the new pool.
|
279
256
|
|
@@ -350,19 +327,22 @@ module AWS
|
|
350
327
|
end
|
351
328
|
end
|
352
329
|
|
353
|
-
# @api private
|
354
330
|
# @note This class is currently not implemented.
|
331
|
+
# @api private
|
355
332
|
class SuspendableSemaphore
|
356
333
|
|
357
334
|
# @note This method is not implemented.
|
335
|
+
# @api private
|
358
336
|
def initialize
|
359
337
|
end
|
360
338
|
|
361
339
|
# @note This method is not implemented.
|
340
|
+
# @api private
|
362
341
|
def acquire
|
363
342
|
end
|
364
343
|
|
365
344
|
# @note This method is not implemented.
|
345
|
+
# @api private
|
366
346
|
def release
|
367
347
|
end
|
368
348
|
end
|
data/lib/aws/decider/version.rb
CHANGED
data/lib/aws/runner.rb
CHANGED
@@ -1,58 +1,54 @@
|
|
1
1
|
module AWS
|
2
2
|
module Flow
|
3
|
+
# The Runner is a command-line utility that can spawn workflow and activity workers according to a specification
|
4
|
+
# that you provide in a [JSON](http://json.org/) configuration file. It is available beginning with version 1.3.0 of
|
5
|
+
# the AWS Flow Framework for Ruby.
|
6
|
+
#
|
7
|
+
# ## Invoking the Runner
|
8
|
+
#
|
9
|
+
# It is invoked like so:
|
10
|
+
#
|
11
|
+
# aws-flow-ruby -f runspec.json
|
12
|
+
#
|
13
|
+
# Where **runspec.json** represents a local JSON file that specifies how to run your activities and workflows.
|
14
|
+
#
|
15
|
+
# ## The Runner Specification File
|
16
|
+
#
|
17
|
+
# The runner is configured by passing it a JSON-formatted configuration file. Here is a minimal example, providing
|
18
|
+
# only the required fields:
|
19
|
+
#
|
20
|
+
# {
|
21
|
+
# "domain": { "name": "ExampleDomain" },
|
22
|
+
# "workflow_workers": [
|
23
|
+
# {
|
24
|
+
# "task_list": "example_workflow_tasklist"
|
25
|
+
# }
|
26
|
+
# ],
|
27
|
+
# "activity_workers": [
|
28
|
+
# {
|
29
|
+
# "task_list": "example_activity_tasklist"
|
30
|
+
# }
|
31
|
+
# ],
|
32
|
+
# }
|
33
|
+
#
|
34
|
+
# ## For More Information
|
35
|
+
#
|
36
|
+
# For a complete description of the runner's specification, with examples of both configuring and using the runner,
|
37
|
+
# see [The Runner](http://docs.aws.amazon.com/amazonswf/latest/awsrbflowguide/the-runner.html) in the *AWS Flow
|
38
|
+
# Framework for Ruby Developer Guide*.
|
39
|
+
#
|
3
40
|
module Runner
|
4
41
|
|
5
|
-
#
|
42
|
+
# Import the necessary gems to run Ruby Flow code.
|
6
43
|
require 'aws/decider'
|
7
44
|
include AWS::Flow
|
8
45
|
require 'json'
|
9
46
|
require 'optparse'
|
10
47
|
require 'socket'
|
11
48
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
## JSON file format that decribes where to find the required elements
|
16
|
-
##
|
17
|
-
|
18
|
-
# Example of the format:
|
19
|
-
# {
|
20
|
-
# "domain":
|
21
|
-
# {
|
22
|
-
# "name": <name_of_the_domain>,
|
23
|
-
# "retention_in_days": <days>
|
24
|
-
# }
|
25
|
-
# "activity_workers": [
|
26
|
-
#
|
27
|
-
# {
|
28
|
-
# "task_list": <name_of_the_task_list>,
|
29
|
-
# "activity_classes": [ <name_of_class_containing_the_activities_to_be_worked_on> ],
|
30
|
-
# "number_of_workers": <number_of_activity_workers_to_spawn>,
|
31
|
-
# "number_of_forks_per_worker": <number_of_forked_workers>
|
32
|
-
# }
|
33
|
-
# //, ... can add more
|
34
|
-
# ],
|
35
|
-
# "workflow_workers": [
|
36
|
-
# {
|
37
|
-
# "task_list": <name_of_the_task_list>,
|
38
|
-
# "workflow_classes": [ <name_of_class_containing_the_workflows_to_be_worked_on> ],
|
39
|
-
# "number_of_workers": <number_of_workflow_workers_to_spawn>
|
40
|
-
# }
|
41
|
-
# //, ... can add more
|
42
|
-
# ],
|
43
|
-
# // Configure which files are 'require'd in order to load the classes
|
44
|
-
# "workflow_paths": [
|
45
|
-
# "lib/workflow.rb"
|
46
|
-
# ],
|
47
|
-
# "activity_paths": [
|
48
|
-
# "lib/activity.rb"
|
49
|
-
# ],
|
50
|
-
# // This is used by the opsworks recipe
|
51
|
-
# "user_agent_prefix" : "ruby-flow-opsworks"
|
52
|
-
# }
|
53
|
-
|
54
|
-
|
55
|
-
# registers the domain if it is not
|
49
|
+
# Registers the domain if it is not already registered.
|
50
|
+
#
|
51
|
+
# @api private
|
56
52
|
def self.setup_domain(json_config)
|
57
53
|
|
58
54
|
swf = create_service_client(json_config)
|
@@ -72,18 +68,27 @@ module AWS
|
|
72
68
|
return AWS::SimpleWorkflow::Domain.new( domain['name'] )
|
73
69
|
end
|
74
70
|
|
71
|
+
# @api private
|
75
72
|
def self.set_process_name(name)
|
76
73
|
$0 = name
|
77
74
|
end
|
78
75
|
|
79
|
-
#
|
76
|
+
# Searches the object space for all subclasses of `clazz`.
|
77
|
+
#
|
78
|
+
# @api private
|
80
79
|
def self.all_subclasses(clazz)
|
81
80
|
ObjectSpace.each_object(Class).select { |klass| klass.is_a? clazz }
|
82
81
|
end
|
83
82
|
|
84
|
-
#
|
85
|
-
#
|
86
|
-
#
|
83
|
+
# Gets the classes to run.
|
84
|
+
#
|
85
|
+
# This method extracts and validates the 'activity_classes' and
|
86
|
+
# 'workflow_classes' fields from the runner specification file, or by
|
87
|
+
# autodiscovery of subclasses of [AWS::Flow::Activities]] and
|
88
|
+
# [AWS::Flow::Workflows] in the object space.
|
89
|
+
#
|
90
|
+
#
|
91
|
+
# @api private
|
87
92
|
def self.get_classes(json_fragment, what)
|
88
93
|
classes = json_fragment[what[:config_key]]
|
89
94
|
if classes.nil? || classes.empty? then
|
@@ -99,12 +104,18 @@ module AWS
|
|
99
104
|
classes
|
100
105
|
end
|
101
106
|
|
102
|
-
#
|
107
|
+
# Used to add implementations to workers; see [get_classes] for more
|
108
|
+
# information.
|
109
|
+
#
|
110
|
+
# @api private
|
103
111
|
def self.add_implementations(worker, json_fragment, what)
|
104
112
|
classes = get_classes(json_fragment, what)
|
105
113
|
classes.each { |c| worker.add_implementation(c) }
|
106
114
|
end
|
107
115
|
|
116
|
+
# Spawns the workers.
|
117
|
+
#
|
118
|
+
# @api private
|
108
119
|
def self.spawn_and_start_workers(json_fragment, process_name, worker)
|
109
120
|
workers = []
|
110
121
|
num_of_workers = json_fragment['number_of_workers'] || FlowConstants::NUM_OF_WORKERS_DEFAULT
|
@@ -117,9 +128,10 @@ module AWS
|
|
117
128
|
workers
|
118
129
|
end
|
119
130
|
|
120
|
-
#
|
121
|
-
#
|
122
|
-
#
|
131
|
+
# Used to support host-specific task lists. When the string "|hostname|"
|
132
|
+
# is found in the task list it is replaced by the actual host name.
|
133
|
+
#
|
134
|
+
# @api private
|
123
135
|
def self.expand_task_list(value)
|
124
136
|
raise ArgumentError.new unless value
|
125
137
|
ret = value
|
@@ -127,23 +139,30 @@ module AWS
|
|
127
139
|
ret
|
128
140
|
end
|
129
141
|
|
142
|
+
# @api private
|
130
143
|
def self.is_empty_field?(json_fragment, field_name)
|
131
144
|
field = json_fragment[field_name]
|
132
145
|
field.nil? || field.empty?
|
133
146
|
end
|
134
147
|
|
135
|
-
#
|
136
|
-
#
|
148
|
+
# Runs the necessary "require" commands to load the code needed to run a
|
149
|
+
# module.
|
137
150
|
#
|
138
|
-
# config_path: the path where the config file is, to be able to
|
151
|
+
# config_path: the path where the config file is, to be able to
|
139
152
|
# resolve relative references
|
153
|
+
#
|
140
154
|
# json_config: the content of the config
|
155
|
+
#
|
141
156
|
# what: what should loaded. This is a hash expected to contain two keys:
|
157
|
+
#
|
142
158
|
# - :default_file : the file to load unless a specific list is provided
|
159
|
+
#
|
143
160
|
# - :config_key : the key of the config element which can contain a
|
144
|
-
#
|
161
|
+
# specific list of files to load
|
162
|
+
#
|
163
|
+
# @api private
|
145
164
|
def self.load_files(config_path, json_config, what)
|
146
|
-
if is_empty_field?(json_config, what[:config_key]) then
|
165
|
+
if is_empty_field?(json_config, what[:config_key]) then
|
147
166
|
file = File.join(File.dirname(config_path), what[:default_file])
|
148
167
|
require file if File.exists? file
|
149
168
|
else
|
@@ -151,6 +170,14 @@ module AWS
|
|
151
170
|
end
|
152
171
|
end
|
153
172
|
|
173
|
+
# Starts the activity workers.
|
174
|
+
#
|
175
|
+
# The activities run by the workers consist of each class that extends
|
176
|
+
# [AWS::Flow::Activities] in the paths provided in the `activity_paths`
|
177
|
+
# section of [the runner specification file][], or that are loaded from
|
178
|
+
# `require` statements in the `workflows.rb` file.
|
179
|
+
#
|
180
|
+
# @api private
|
154
181
|
def self.start_activity_workers(swf, domain = nil, config_path, json_config)
|
155
182
|
workers = []
|
156
183
|
# load all classes for the activities
|
@@ -178,6 +205,14 @@ module AWS
|
|
178
205
|
return workers
|
179
206
|
end
|
180
207
|
|
208
|
+
# Starts the workflow workers.
|
209
|
+
#
|
210
|
+
# The workflows run by the workers consist of each class that extends
|
211
|
+
# [AWS::Flow::Workflows] in the paths provided in the `workflow_paths`
|
212
|
+
# section of [the runner specification file][], or that are loaded from
|
213
|
+
# `require` statements in the `workflows.rb` file.
|
214
|
+
#
|
215
|
+
# @api private
|
181
216
|
def self.start_workflow_workers(swf, domain = nil, config_path, json_config)
|
182
217
|
workers = []
|
183
218
|
# load all the classes for the workflows
|
@@ -202,23 +237,23 @@ module AWS
|
|
202
237
|
return workers
|
203
238
|
end
|
204
239
|
|
240
|
+
# @api private
|
205
241
|
def self.create_service_client(json_config)
|
206
242
|
# set the UserAgent prefix for all clients
|
207
243
|
if json_config['user_agent_prefix'] then
|
208
244
|
AWS.config(user_agent_prefix: json_config['user_agent_prefix'])
|
209
245
|
end
|
210
|
-
|
246
|
+
|
211
247
|
swf = AWS::SimpleWorkflow.new
|
212
248
|
end
|
213
249
|
|
250
|
+
# Starts the workers and returns an array of process IDs (pids) for the
|
251
|
+
# worker processes.
|
214
252
|
#
|
215
|
-
#
|
216
|
-
# processes
|
217
|
-
#
|
253
|
+
# @api private
|
218
254
|
def self.start_workers(domain = nil, config_path, json_config)
|
219
|
-
|
220
255
|
workers = []
|
221
|
-
|
256
|
+
|
222
257
|
swf = create_service_client(json_config)
|
223
258
|
|
224
259
|
workers << start_activity_workers(swf, domain, config_path, json_config)
|
@@ -226,17 +261,20 @@ module AWS
|
|
226
261
|
|
227
262
|
# needed to avoid returning nested arrays based on the calls above
|
228
263
|
workers.flatten!
|
229
|
-
|
230
264
|
end
|
231
265
|
|
232
|
-
#
|
233
|
-
# orderly shutdown
|
266
|
+
# Sets up forwarding of signals to child processes to facilitate and
|
267
|
+
# support orderly shutdown.
|
268
|
+
#
|
269
|
+
# @api private
|
234
270
|
def self.setup_signal_handling(workers)
|
235
271
|
Signal.trap("INT") { workers.each { |w| Process.kill("INT", w) } }
|
236
272
|
end
|
237
273
|
|
274
|
+
# Waits until all the child workers are finished.
|
275
|
+
#
|
238
276
|
# TODO: use a logger
|
239
|
-
#
|
277
|
+
# @api private
|
240
278
|
def self.wait_for_child_processes(workers)
|
241
279
|
until workers.empty?
|
242
280
|
puts "waiting on workers " + workers.to_s + " to complete"
|
@@ -245,23 +283,32 @@ module AWS
|
|
245
283
|
end
|
246
284
|
end
|
247
285
|
|
248
|
-
#
|
249
|
-
#
|
250
|
-
#
|
286
|
+
# Extends the load path so that the 'require' of workflow and activity
|
287
|
+
# implementation files can succeed before adding the implementation
|
288
|
+
# classes to the workers.
|
289
|
+
#
|
290
|
+
# @api private
|
251
291
|
def self.add_dir_to_load_path(path)
|
252
292
|
raise ArgumentError.new("Invalid directory path: \"" + path.to_s + "\"") if not FileTest.directory? path
|
253
293
|
$LOAD_PATH.unshift path.to_s
|
254
294
|
end
|
255
295
|
|
256
296
|
#
|
257
|
-
#
|
297
|
+
# Loads the runner specification from a JSON file (passed in with the
|
298
|
+
# `--file` parameter when run from the shell).
|
258
299
|
#
|
300
|
+
# @api private
|
259
301
|
def self.load_config_json(path)
|
260
302
|
raise ArgumentError.new("Invalid file path: \"" + path.to_s + "\"") if not File.file? path
|
261
303
|
config = JSON.parse(File.open(path) { |f| f.read })
|
262
304
|
end
|
263
305
|
|
264
|
-
|
306
|
+
# Interprets the command-line paramters pased in from the shell.
|
307
|
+
#
|
308
|
+
# The parameter `--file` (short: `-f`) is *required*, and must provide the
|
309
|
+
# path to the runner configuration file.
|
310
|
+
#
|
311
|
+
# @api private
|
265
312
|
def self.parse_command_line(argv = ARGV)
|
266
313
|
options = {}
|
267
314
|
optparse = OptionParser.new do |opts|
|
@@ -272,12 +319,16 @@ module AWS
|
|
272
319
|
|
273
320
|
optparse.parse!(argv)
|
274
321
|
|
275
|
-
# file parameter is not optional
|
322
|
+
# The `--file` parameter is not optional.
|
276
323
|
raise OptionParser::MissingArgument.new("file") if options[:file].nil?
|
277
324
|
|
278
325
|
return options
|
279
326
|
end
|
280
327
|
|
328
|
+
#
|
329
|
+
# Invoked from the shell.
|
330
|
+
#
|
331
|
+
# @api private
|
281
332
|
def self.main
|
282
333
|
options = parse_command_line
|
283
334
|
config_path = options[:file]
|
@@ -287,12 +338,10 @@ module AWS
|
|
287
338
|
workers = start_workers(domain, config_path, config)
|
288
339
|
setup_signal_handling(workers)
|
289
340
|
|
290
|
-
#
|
291
|
-
# to support and facilitate an orderly shutdown
|
341
|
+
# Hang there until killed: this process is used to relay signals to
|
342
|
+
# children to support and facilitate an orderly shutdown.
|
292
343
|
wait_for_child_processes(workers)
|
293
|
-
|
294
344
|
end
|
295
|
-
|
296
345
|
end
|
297
346
|
end
|
298
347
|
end
|
metadata
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aws-flow
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Steger, Paritosh Mohan, Jacques Thomas
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-09-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name: aws-sdk
|
14
|
+
name: aws-sdk-v1
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ~>
|
@@ -133,4 +133,3 @@ signing_key:
|
|
133
133
|
specification_version: 4
|
134
134
|
summary: AWS Flow Framework for Ruby
|
135
135
|
test_files: []
|
136
|
-
has_rdoc:
|