simpler_workflow 0.1.8 → 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -18,11 +18,24 @@ module SimplerWorkflow
18
18
  $logger || Rails.logger
19
19
  end
20
20
 
21
+ def exception_reporter(&block)
22
+ if block_given?
23
+ @exception_reporter = DefaultExceptionReporter.new(&block)
24
+ end
25
+
26
+ @exception_reporter || DefaultExceptionReporter.new
27
+ end
28
+
29
+ def exception_reporter=(exception_handler)
30
+ @exception_reporter = exception_handler
31
+ end
32
+
21
33
  autoload :Version, 'simpler_workflow/version'
22
34
  autoload :Domain, 'simpler_workflow/domain'
23
35
  autoload :Workflow, 'simpler_workflow/workflow'
24
36
  autoload :Activity, 'simpler_workflow/activity'
25
37
  autoload :OptionsAsMethods, 'simpler_workflow/options_as_methods'
38
+ autoload :DefaultExceptionReporter, 'simpler_workflow/default_exception_reporter'
26
39
  end
27
40
 
28
41
  class Map
@@ -52,8 +52,10 @@ module SimplerWorkflow
52
52
  logger.info("Performing task #{name}")
53
53
  @perform_task.call(task)
54
54
  rescue => e
55
- logger.error e.message
56
- logger.error e.backtrace.join("\n")
55
+ context = to_activity_type
56
+ context[:input] = task.input
57
+ context[:activity_id] = task.activity_id
58
+ SimplerWorkflow.exception_reporter.report(e, context)
57
59
  task.fail! :reason => e.message[0..250], :details => {:failure_policy => failure_policy}.to_json
58
60
  end
59
61
 
@@ -80,8 +82,11 @@ module SimplerWorkflow
80
82
  end
81
83
  rescue Timeout::Error => e
82
84
  rescue => e
83
- logger.error(e.message)
84
- logger.error(e.backtrace.join("\n"))
85
+ context = to_activity_type
86
+ context[:input] = task.input
87
+ context[:activity_id] = task.activity_id
88
+ SimplerWorkflow.exception_reporter.report(e, context)
89
+ raise e
85
90
  end
86
91
  end
87
92
  end
@@ -0,0 +1,26 @@
1
+ # Default exception handler. Just logs to the logger and re-raise
2
+ # so the exception can be managed as usual.
3
+
4
+ module SimplerWorkflow
5
+ class DefaultExceptionReporter
6
+ attr_accessor :reporter, :tag
7
+
8
+ def initialize(&block)
9
+ @reporter = block if block_given?
10
+ end
11
+
12
+ def report(e, context = {})
13
+ if reporter
14
+ reporter.call(e, context)
15
+ else
16
+ SimplerWorkflow.logger.error("[#{tag}] Exception: #{e.message}")
17
+ SimplerWorkflow.logger.error("[#{tag}] Context: #{context.inspect}") unless context.empty?
18
+ SimplerWorkflow.logger.error("[#{tag}] Backtrace:\n#{e.backtrace.join("\n")}")
19
+ end
20
+ end
21
+
22
+ def tag
23
+ @tag || "SimplerWorkflow"
24
+ end
25
+ end
26
+ end
@@ -1,3 +1,3 @@
1
1
  module SimplerWorkflow
2
- VERSION = "0.1.8"
2
+ VERSION = "0.1.9"
3
3
  end
@@ -31,23 +31,32 @@ module SimplerWorkflow
31
31
  def decision_loop
32
32
  logger.info("Starting decision loop for #{name.to_s}, #{version} listening to #{task_list}")
33
33
  domain.decision_tasks.poll(task_list) do |decision_task|
34
- start_time = DateTime.now
35
- logger.info("Received decision task #{decision_task.id} at #{start_time}")
36
- decision_task.extend AWS::SimpleWorkflow::DecisionTaskAdditions
37
- decision_task.new_events.each do |event|
38
- logger.info("Processing #{event.event_type}")
39
- case event.event_type
40
- when 'WorkflowExecutionStarted'
41
- start_execution(decision_task, event)
42
- when 'ActivityTaskCompleted'
43
- activity_completed(decision_task, event)
44
- when 'ActivityTaskFailed'
45
- activity_failed(decision_task, event)
46
- when 'ActivityTaskTimedOut'
47
- activity_timed_out(decision_task, event)
34
+ begin
35
+ start_time = DateTime.now
36
+ logger.info("Received decision task #{decision_task.id} at #{start_time}")
37
+ decision_task.extend AWS::SimpleWorkflow::DecisionTaskAdditions
38
+ decision_task.new_events.each do |event|
39
+ logger.info("Processing #{event.event_type}")
40
+ case event.event_type
41
+ when 'WorkflowExecutionStarted'
42
+ start_execution(decision_task, event)
43
+ when 'ActivityTaskCompleted'
44
+ activity_completed(decision_task, event)
45
+ when 'ActivityTaskFailed'
46
+ activity_failed(decision_task, event)
47
+ when 'ActivityTaskTimedOut'
48
+ activity_timed_out(decision_task, event)
49
+ end
48
50
  end
51
+ rescue => e
52
+ context = {
53
+ :workflow_execution => decision_task.workflow_execution,
54
+ :workflow => to_workflow_type,
55
+ :decision_task => decision_task
56
+ }
57
+ SimplerWorkflow.exception_reporter.report(e, context)
58
+ raise e
49
59
  end
50
- logger.info("Completed Processing Decision Task #{decision_task.id} in #{((DateTime.now - start_time) * 24 * 60 * 60).to_i} seconds.")
51
60
  end
52
61
  rescue Timeout::Error => e
53
62
  retry
@@ -117,6 +126,10 @@ module SimplerWorkflow
117
126
  end
118
127
  end
119
128
 
129
+ def to_workflow_type
130
+ { :name => name, :version => version }
131
+ end
132
+
120
133
  def start_workflow(input, options = {})
121
134
  options[:input] = input
122
135
  domain.workflow_types[name.to_s, version].start_execution(options)
metadata CHANGED
@@ -1,104 +1,104 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: simpler_workflow
3
- version: !ruby/object:Gem::Version
4
- hash: 11
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.9
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 1
9
- - 8
10
- version: 0.1.8
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Frederic Jean
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2012-07-19 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- version_requirements: &id001 !ruby/object:Gem::Requirement
12
+ date: 2012-09-28 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: aws-sdk
16
+ requirement: !ruby/object:Gem::Requirement
22
17
  none: false
23
- requirements:
18
+ requirements:
24
19
  - - ~>
25
- - !ruby/object:Gem::Version
26
- hash: 3
27
- segments:
28
- - 1
29
- - 5
30
- - 0
20
+ - !ruby/object:Gem::Version
31
21
  version: 1.5.0
32
- name: aws-sdk
33
22
  type: :runtime
34
23
  prerelease: false
35
- requirement: *id001
36
- - !ruby/object:Gem::Dependency
37
- version_requirements: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
38
25
  none: false
39
- requirements:
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- hash: 3
43
- segments:
44
- - 0
45
- version: "0"
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 1.5.0
30
+ - !ruby/object:Gem::Dependency
46
31
  name: map
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
47
38
  type: :runtime
48
39
  prerelease: false
49
- requirement: *id002
50
- - !ruby/object:Gem::Dependency
51
- version_requirements: &id003 !ruby/object:Gem::Requirement
40
+ version_requirements: !ruby/object:Gem::Requirement
52
41
  none: false
53
- requirements:
54
- - - ">="
55
- - !ruby/object:Gem::Version
56
- hash: 3
57
- segments:
58
- - 0
59
- version: "0"
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
60
47
  name: rake
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
61
54
  type: :development
62
55
  prerelease: false
63
- requirement: *id003
64
- - !ruby/object:Gem::Dependency
65
- version_requirements: &id004 !ruby/object:Gem::Requirement
56
+ version_requirements: !ruby/object:Gem::Requirement
66
57
  none: false
67
- requirements:
68
- - - ">="
69
- - !ruby/object:Gem::Version
70
- hash: 3
71
- segments:
72
- - 0
73
- version: "0"
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
74
63
  name: rspec
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
75
70
  type: :development
76
71
  prerelease: false
77
- requirement: *id004
78
- - !ruby/object:Gem::Dependency
79
- version_requirements: &id005 !ruby/object:Gem::Requirement
72
+ version_requirements: !ruby/object:Gem::Requirement
80
73
  none: false
81
- requirements:
82
- - - ">="
83
- - !ruby/object:Gem::Version
84
- hash: 3
85
- segments:
86
- - 0
87
- version: "0"
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
88
79
  name: travis-lint
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
89
86
  type: :development
90
87
  prerelease: false
91
- requirement: *id005
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
92
94
  description: A wrapper around Amazon's Simple Workflow Service
93
- email:
95
+ email:
94
96
  - fred@snugghome.com
95
- executables:
97
+ executables:
96
98
  - swf
97
99
  extensions: []
98
-
99
100
  extra_rdoc_files: []
100
-
101
- files:
101
+ files:
102
102
  - .gitignore
103
103
  - .rspec
104
104
  - .travis.yml
@@ -111,6 +111,7 @@ files:
111
111
  - lib/aws/simple_workflow/decision_task_additions.rb
112
112
  - lib/simpler_workflow.rb
113
113
  - lib/simpler_workflow/activity.rb
114
+ - lib/simpler_workflow/default_exception_reporter.rb
114
115
  - lib/simpler_workflow/domain.rb
115
116
  - lib/simpler_workflow/options_as_methods.rb
116
117
  - lib/simpler_workflow/version.rb
@@ -122,38 +123,30 @@ files:
122
123
  - spec/spec_helper.rb
123
124
  homepage: https://github.com/SnuggHome/simpler_workflow
124
125
  licenses: []
125
-
126
126
  post_install_message:
127
127
  rdoc_options: []
128
-
129
- require_paths:
128
+ require_paths:
130
129
  - lib
131
- required_ruby_version: !ruby/object:Gem::Requirement
130
+ required_ruby_version: !ruby/object:Gem::Requirement
132
131
  none: false
133
- requirements:
134
- - - ">="
135
- - !ruby/object:Gem::Version
136
- hash: 3
137
- segments:
138
- - 0
139
- version: "0"
140
- required_rubygems_version: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - ! '>='
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ required_rubygems_version: !ruby/object:Gem::Requirement
141
137
  none: false
142
- requirements:
143
- - - ">="
144
- - !ruby/object:Gem::Version
145
- hash: 3
146
- segments:
147
- - 0
148
- version: "0"
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
149
142
  requirements: []
150
-
151
143
  rubyforge_project:
152
- rubygems_version: 1.8.20
144
+ rubygems_version: 1.8.23
153
145
  signing_key:
154
146
  specification_version: 3
155
- summary: A wrapper and DSL around Amazon's Simple Workflow Service with the goal of making it almost pleasant to define workflows.
156
- test_files:
147
+ summary: A wrapper and DSL around Amazon's Simple Workflow Service with the goal of
148
+ making it almost pleasant to define workflows.
149
+ test_files:
157
150
  - spec/domain_spec.rb
158
151
  - spec/simpler_workflow_spec.rb
159
152
  - spec/spec_helper.rb