simpler_workflow 0.3.0.beta → 0.3.0.beta2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +2 -0
- data/README.md +11 -0
- data/lib/simpler_workflow/activity.rb +16 -20
- data/lib/simpler_workflow/version.rb +1 -1
- data/lib/simpler_workflow/workflow.rb +15 -27
- data/spec/activity_spec.rb +1 -0
- data/spec/workflow_spec.rb +12 -13
- metadata +3 -3
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# SimplerWorkflow
|
2
2
|
|
3
3
|
[](http://travis-ci.org/fredjean/simpler_workflow)
|
4
|
+
[](https://codeclimate.com/github/fredjean/simpler_workflow)
|
4
5
|
|
5
6
|
A wrapper around Amazon's Simple Workflow Service meant to simplify declaring and using activities and workflow. Provides some sane defaults
|
6
7
|
and work around some idiosyncracies of the platform.
|
@@ -176,6 +177,16 @@ You can also define similar hooks for events using the following methods:
|
|
176
177
|
* ```on_activity_completed``` is called when an activity completes and SWF reports back to the decision loop.
|
177
178
|
* ```on_activity_failed``` is called when an activity reports a failure to SWF.
|
178
179
|
|
180
|
+
### Triggering Workflows
|
181
|
+
|
182
|
+
You can trigger the worklow with the following command:
|
183
|
+
|
184
|
+
```ruby
|
185
|
+
SimplerWorkflow::Domain["my-test-domain"].start_workflow("hello-world", "1.0.1", "AWS")
|
186
|
+
```
|
187
|
+
|
188
|
+
The parameters are the name of the workflow, the version as well as a string representing the input to the workflow.
|
189
|
+
|
179
190
|
## Workflow and Activity Versioning
|
180
191
|
|
181
192
|
All workflow types and activity types are versioned under SWF. This allows an organization to release new versions of a workflow or activity
|
@@ -2,22 +2,23 @@ module SimplerWorkflow
|
|
2
2
|
class Activity
|
3
3
|
include OptionsAsMethods
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
@options =
|
5
|
+
attr_reader :domain, :name, :version, :options, :next_activity, :task_list
|
6
|
+
|
7
|
+
def initialize(domain, name, version, options = {})
|
8
|
+
default_options =
|
9
|
+
{
|
10
|
+
:default_task_list => name,
|
11
|
+
:default_task_start_to_close_timeout => 5 * 60,
|
12
|
+
:default_task_schedule_to_start_timeout => 5 * 60,
|
13
|
+
:default_task_schedule_to_close_timeout => 10 * 60,
|
14
|
+
:default_task_heartbeat_timeout => :none
|
15
|
+
}
|
16
|
+
@options = default_options.merge(options)
|
17
17
|
@domain = domain
|
18
18
|
@name = name
|
19
19
|
@version = version
|
20
20
|
@failure_policy = :fail
|
21
|
+
@task_list = name.to_s
|
21
22
|
end
|
22
23
|
|
23
24
|
def on_success(activity, version = nil)
|
@@ -100,7 +101,7 @@ module SimplerWorkflow
|
|
100
101
|
@time_to_exit = true
|
101
102
|
end
|
102
103
|
|
103
|
-
Signal.trap('INT') do
|
104
|
+
Signal.trap('INT') do
|
104
105
|
logger.info("Received SIGINT")
|
105
106
|
Process.exit!(0)
|
106
107
|
end
|
@@ -113,17 +114,12 @@ module SimplerWorkflow
|
|
113
114
|
loop do
|
114
115
|
begin
|
115
116
|
logger.info("Starting activity_loop for #{name}")
|
116
|
-
domain.activity_tasks.poll(
|
117
|
+
domain.activity_tasks.poll(task_list) do |task|
|
117
118
|
begin
|
118
119
|
logger.info("Received task...")
|
119
120
|
perform_task(task)
|
120
121
|
unless task.responded?
|
121
|
-
|
122
|
-
result = {:next_activity => next_activity}.to_json
|
123
|
-
task.complete!(:result => result)
|
124
|
-
else
|
125
|
-
task.complete!
|
126
|
-
end
|
122
|
+
task.complete!
|
127
123
|
end
|
128
124
|
rescue => e
|
129
125
|
context = {}
|
@@ -35,7 +35,7 @@ module SimplerWorkflow
|
|
35
35
|
@time_to_exit = true
|
36
36
|
end
|
37
37
|
|
38
|
-
Signal.trap('INT') do
|
38
|
+
Signal.trap('INT') do
|
39
39
|
logger.info("Received SIGINT")
|
40
40
|
Process.exit!(0)
|
41
41
|
end
|
@@ -82,19 +82,19 @@ module SimplerWorkflow
|
|
82
82
|
end
|
83
83
|
|
84
84
|
def on_start_execution(&block)
|
85
|
-
event_handlers['WorkflowExecutionStarted'] =
|
85
|
+
event_handlers['WorkflowExecutionStarted'] = block
|
86
86
|
end
|
87
87
|
|
88
88
|
def on_activity_completed(&block)
|
89
|
-
event_handlers['ActivityTaskCompleted'] =
|
89
|
+
event_handlers['ActivityTaskCompleted'] = block
|
90
90
|
end
|
91
91
|
|
92
92
|
def on_activity_failed(&block)
|
93
|
-
event_handlers['ActivityTaskFailed'] =
|
93
|
+
event_handlers['ActivityTaskFailed'] = block
|
94
94
|
end
|
95
95
|
|
96
96
|
def on_activity_timed_out(&block)
|
97
|
-
event_handlers['ActivityTaskTimedOut'] =
|
97
|
+
event_handlers['ActivityTaskTimedOut'] = block
|
98
98
|
end
|
99
99
|
|
100
100
|
def self.[](name, version)
|
@@ -135,15 +135,15 @@ module SimplerWorkflow
|
|
135
135
|
logger.info("Received decision task")
|
136
136
|
decision_task.new_events.each do |event|
|
137
137
|
logger.info("Processing #{event.event_type}")
|
138
|
-
event_handlers.fetch(event.event_type, DefaultEventHandler.new(self)).
|
138
|
+
event_handlers.fetch(event.event_type, DefaultEventHandler.new(self)).call(decision_task, event)
|
139
139
|
end
|
140
140
|
end
|
141
141
|
|
142
142
|
def event_handlers
|
143
143
|
@event_handlers ||= Map[
|
144
|
-
:WorkflowExecutionStarted , WorkflowExecutionStartedHandler.new(self) ,
|
145
|
-
:ActivityTaskCompleted , ActivityTaskCompletedHandler.new(self) ,
|
146
|
-
:ActivityTaskFailed , ActivityTaskFailedHandler.new(self) ,
|
144
|
+
:WorkflowExecutionStarted , WorkflowExecutionStartedHandler.new(self) ,
|
145
|
+
:ActivityTaskCompleted , ActivityTaskCompletedHandler.new(self) ,
|
146
|
+
:ActivityTaskFailed , ActivityTaskFailedHandler.new(self) ,
|
147
147
|
:ActivityTaskTimedOut , ActivityTaskTimedOutHandler.new(self)
|
148
148
|
]
|
149
149
|
end
|
@@ -175,23 +175,11 @@ module SimplerWorkflow
|
|
175
175
|
workflow.initial_activity_type
|
176
176
|
end
|
177
177
|
|
178
|
-
def
|
179
|
-
end
|
180
|
-
|
181
|
-
class WorkflowEventHandler
|
182
|
-
attr_accessor :handler
|
183
|
-
|
184
|
-
def initialize(&block)
|
185
|
-
@handler = block
|
186
|
-
end
|
187
|
-
|
188
|
-
def process(decision_task, event)
|
189
|
-
handler.call(decision_task, event)
|
190
|
-
end
|
178
|
+
def call(*args); end
|
191
179
|
end
|
192
180
|
|
193
181
|
class ActivityTaskTimedOutHandler < DefaultEventHandler
|
194
|
-
def
|
182
|
+
def call(decision_task, event)
|
195
183
|
case event.attributes.timeoutType
|
196
184
|
when 'START_TO_CLOSE', 'SCHEDULE_TO_START', 'SCHEDULE_TO_CLOSE'
|
197
185
|
last_activity_type = last_activity(decision_task, event)
|
@@ -204,10 +192,10 @@ module SimplerWorkflow
|
|
204
192
|
end
|
205
193
|
|
206
194
|
class ActivityTaskFailedHandler < DefaultEventHandler
|
207
|
-
def
|
195
|
+
def call(decision_task, event)
|
208
196
|
last_activity_type = last_activity(decision_task, event)
|
209
197
|
failed_activity = domain.activities[last_activity_type]
|
210
|
-
|
198
|
+
|
211
199
|
case failed_activity.failure_policy
|
212
200
|
when :abort, :cancel
|
213
201
|
SimplerWorkflow.logger.info("Cancelling workflow execution.")
|
@@ -223,7 +211,7 @@ module SimplerWorkflow
|
|
223
211
|
end
|
224
212
|
|
225
213
|
class ActivityTaskCompletedHandler < DefaultEventHandler
|
226
|
-
def
|
214
|
+
def call(decision_task, event)
|
227
215
|
last_activity_type = last_activity(decision_task, event)
|
228
216
|
|
229
217
|
completed_activity = domain.activities[last_activity_type]
|
@@ -238,7 +226,7 @@ module SimplerWorkflow
|
|
238
226
|
end
|
239
227
|
|
240
228
|
class WorkflowExecutionStartedHandler < DefaultEventHandler
|
241
|
-
def
|
229
|
+
def call(decision_task, event)
|
242
230
|
decision_task.schedule_activity_task initial_activity_type, input: event.attributes.input
|
243
231
|
end
|
244
232
|
end
|
data/spec/activity_spec.rb
CHANGED
data/spec/workflow_spec.rb
CHANGED
@@ -35,7 +35,7 @@ module SimplerWorkflow
|
|
35
35
|
end
|
36
36
|
|
37
37
|
context "Registering a new workflow." do
|
38
|
-
before :each do
|
38
|
+
before :each do
|
39
39
|
Workflow.send :public, :event_handlers
|
40
40
|
end
|
41
41
|
|
@@ -82,7 +82,7 @@ module SimplerWorkflow
|
|
82
82
|
|
83
83
|
decision_task.should_receive(:new_events).and_return([new_event])
|
84
84
|
|
85
|
-
event_handlers[new_event.event_type].should_receive(:
|
85
|
+
event_handlers[new_event.event_type].should_receive(:call).with(decision_task, new_event)
|
86
86
|
|
87
87
|
workflow.send :handle_decision_task, decision_task
|
88
88
|
end
|
@@ -102,7 +102,7 @@ module SimplerWorkflow
|
|
102
102
|
event = stub( :attributes => stub( :input => "Mary had a little lamb"))
|
103
103
|
decision_task.should_receive(:schedule_activity_task).with(domain.activity_types[:test_activity, '1.0.0'], input: event.attributes.input)
|
104
104
|
|
105
|
-
event_handlers[:WorkflowExecutionStarted].
|
105
|
+
event_handlers[:WorkflowExecutionStarted].call(decision_task, event)
|
106
106
|
end
|
107
107
|
end
|
108
108
|
|
@@ -120,7 +120,7 @@ module SimplerWorkflow
|
|
120
120
|
decision_task.should_receive(:scheduled_event).with(event).and_return(scheduled_event)
|
121
121
|
decision_task.should_receive(:complete_workflow_execution).with(result: 'success')
|
122
122
|
|
123
|
-
event_handlers[:ActivityTaskCompleted].
|
123
|
+
event_handlers[:ActivityTaskCompleted].call(decision_task, event)
|
124
124
|
end
|
125
125
|
|
126
126
|
it "should schedule the next activity if the current one declares one" do
|
@@ -129,7 +129,7 @@ module SimplerWorkflow
|
|
129
129
|
|
130
130
|
test_activity = domain.register_activity(:test_activity, '1.0.0')
|
131
131
|
|
132
|
-
scheduled_activity = domain.register_activity(:success_activity, '1.0.0') do
|
132
|
+
scheduled_activity = domain.register_activity(:success_activity, '1.0.0') do
|
133
133
|
on_success :test_activity, '1.0.0'
|
134
134
|
end
|
135
135
|
|
@@ -142,7 +142,7 @@ module SimplerWorkflow
|
|
142
142
|
decision_task.should_receive(:scheduled_event).with(event).twice.and_return(scheduled_event)
|
143
143
|
decision_task.should_receive(:schedule_activity).with(next_activity, input: scheduled_event.attributes.input)
|
144
144
|
|
145
|
-
event_handlers[:ActivityTaskCompleted].
|
145
|
+
event_handlers[:ActivityTaskCompleted].call(decision_task, event)
|
146
146
|
end
|
147
147
|
end
|
148
148
|
|
@@ -159,7 +159,7 @@ module SimplerWorkflow
|
|
159
159
|
decision_task.should_receive(:fail_workflow_execution)
|
160
160
|
decision_task.should_receive(:scheduled_event).with(event).and_return(scheduled_event)
|
161
161
|
|
162
|
-
event_handlers[:ActivityTaskFailed].
|
162
|
+
event_handlers[:ActivityTaskFailed].call(decision_task, event)
|
163
163
|
end
|
164
164
|
|
165
165
|
it "should cancel the execution if instructed to abort" do
|
@@ -175,7 +175,7 @@ module SimplerWorkflow
|
|
175
175
|
decision_task.should_receive(:scheduled_event).with(event).and_return(scheduled_event)
|
176
176
|
decision_task.should_receive(:cancel_workflow_execution)
|
177
177
|
|
178
|
-
event_handlers[:ActivityTaskFailed].
|
178
|
+
event_handlers[:ActivityTaskFailed].call(decision_task, event)
|
179
179
|
end
|
180
180
|
|
181
181
|
it "should cancel the execution if instructed to do so" do
|
@@ -192,7 +192,7 @@ module SimplerWorkflow
|
|
192
192
|
decision_task.should_receive(:scheduled_event).with(event).and_return(scheduled_event)
|
193
193
|
decision_task.should_receive(:cancel_workflow_execution)
|
194
194
|
|
195
|
-
event_handlers[:ActivityTaskFailed].
|
195
|
+
event_handlers[:ActivityTaskFailed].call(decision_task, event)
|
196
196
|
end
|
197
197
|
|
198
198
|
it "should reschedule the activity if requested" do
|
@@ -209,9 +209,8 @@ module SimplerWorkflow
|
|
209
209
|
decision_task.should_receive(:scheduled_event).with(event).twice.and_return(scheduled_event)
|
210
210
|
decision_task.should_receive(:schedule_activity_task).with(test_activity.to_activity_type, input: scheduled_event.attributes.input)
|
211
211
|
|
212
|
-
event_handlers[:ActivityTaskFailed].
|
212
|
+
event_handlers[:ActivityTaskFailed].call(decision_task, event)
|
213
213
|
end
|
214
|
-
|
215
214
|
end
|
216
215
|
|
217
216
|
context "an activity timed out" do
|
@@ -226,7 +225,7 @@ module SimplerWorkflow
|
|
226
225
|
|
227
226
|
decision_task.should_receive(:scheduled_event).twice.and_return(scheduled_event)
|
228
227
|
decision_task.should_receive(:schedule_activity_task).with(activity_type, input: scheduled_event.attributes.input)
|
229
|
-
event_handlers[:ActivityTaskTimedOut].
|
228
|
+
event_handlers[:ActivityTaskTimedOut].call(decision_task, event)
|
230
229
|
end
|
231
230
|
end
|
232
231
|
|
@@ -236,7 +235,7 @@ module SimplerWorkflow
|
|
236
235
|
|
237
236
|
decision_task.should_receive(:fail_workflow_execution)
|
238
237
|
|
239
|
-
event_handlers[:ActivityTaskTimedOut].
|
238
|
+
event_handlers[:ActivityTaskTimedOut].call(decision_task, event)
|
240
239
|
end
|
241
240
|
end
|
242
241
|
end
|
metadata
CHANGED
@@ -2,14 +2,14 @@
|
|
2
2
|
name: simpler_workflow
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease: 6
|
5
|
-
version: 0.3.0.
|
5
|
+
version: 0.3.0.beta2
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Frederic Jean
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-04-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -192,7 +192,7 @@ files:
|
|
192
192
|
- spec/workflow_spec.rb
|
193
193
|
homepage: https://github.com/fredjean/simpler_workflow
|
194
194
|
licenses: []
|
195
|
-
post_install_message: ! "simpler_workflow 0.3.0.
|
195
|
+
post_install_message: ! "simpler_workflow 0.3.0.beta2\n========================\n\nHave
|
196
196
|
a look at https://github.com/fredjean/simpler_workflow/wiki/MIgrating-to-0.2.0 if
|
197
197
|
you\nare upgrading from a 0.1.x version of the gem. There is a fundamental change
|
198
198
|
in how the \nactivity and decision loops are run. You may need to adjust your application
|