simpler_workflow 0.3.0.beta → 0.3.0.beta2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
[![Build Status](https://secure.travis-ci.org/fredjean/simpler_workflow.png)](http://travis-ci.org/fredjean/simpler_workflow)
|
4
|
+
[![Code Climate](https://codeclimate.com/github/fredjean/simpler_workflow.png)](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
|