resque-multi-step 1.0.1 → 1.1.0
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/VERSION +1 -1
- data/lib/resque/plugins/multi_step_task.rb +40 -7
- data/resque-multi-step.gemspec +2 -2
- metadata +4 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0
|
1
|
+
1.1.0
|
@@ -11,6 +11,11 @@ module Resque
|
|
11
11
|
class NoSuchMultiStepTask < StandardError; end
|
12
12
|
class NotReadyForFinalization < StandardError; end
|
13
13
|
class FinalizationAlreadyBegun < StandardError; end
|
14
|
+
class StdOutLogger
|
15
|
+
def warn(*args); puts args; end
|
16
|
+
def info(*args); puts args; end
|
17
|
+
def debug(*args); puts args; end
|
18
|
+
end
|
14
19
|
|
15
20
|
class << self
|
16
21
|
include Constantization
|
@@ -34,7 +39,7 @@ module Resque
|
|
34
39
|
redis.sismember("active-tasks", task_id)
|
35
40
|
end
|
36
41
|
|
37
|
-
# Create a brand new
|
42
|
+
# Create a brand new multi-step-task.
|
38
43
|
#
|
39
44
|
# @param [#to_s] slug The descriptive slug of the new job. Default: a
|
40
45
|
# random UUID
|
@@ -52,16 +57,16 @@ module Resque
|
|
52
57
|
end
|
53
58
|
task_id << "~" << nonce
|
54
59
|
|
55
|
-
|
56
|
-
|
60
|
+
mst = new(task_id)
|
61
|
+
mst.nuke
|
57
62
|
redis.sadd("active-tasks", task_id)
|
58
63
|
redis.sismember("active-tasks", task_id)
|
59
64
|
if block_given?
|
60
65
|
yield pjg
|
61
|
-
|
66
|
+
mst.finalizable!
|
62
67
|
end
|
63
68
|
|
64
|
-
|
69
|
+
mst
|
65
70
|
end
|
66
71
|
|
67
72
|
# Prevent calling MultiStepTask.new
|
@@ -71,13 +76,13 @@ module Resque
|
|
71
76
|
#
|
72
77
|
# @param [#to_s] task_id The unique key for the job group of interest.
|
73
78
|
#
|
74
|
-
# @return [
|
79
|
+
# @return [MultiStepTask] The group of interest
|
75
80
|
#
|
76
81
|
# @raise [NoSuchMultiStepTask] If there is not a group with the specified key.
|
77
82
|
def find(task_id)
|
78
83
|
raise NoSuchMultiStepTask unless active?(task_id)
|
79
84
|
|
80
|
-
|
85
|
+
mst = new(task_id)
|
81
86
|
end
|
82
87
|
|
83
88
|
# Handle job invocation
|
@@ -89,8 +94,16 @@ module Resque
|
|
89
94
|
def perform_without_maybe_finalize(task_id, job_module_name, *args)
|
90
95
|
task = MultiStepTask.find(task_id)
|
91
96
|
begin
|
97
|
+
job_start_key = "#{task_id}_#{job_module_name}_#{args}-start-time-#{nonce}"
|
98
|
+
task.redis.set(job_start_key, Time.now.to_i)
|
99
|
+
logger.debug("[Resque Multi-Step-Task] Executing #{job_module_name} job for #{task_id} at #{Time.now} (args: #{args})")
|
100
|
+
|
101
|
+
# perform the task
|
92
102
|
constantize(job_module_name).perform(*args)
|
103
|
+
|
104
|
+
logger.debug("[Resque Multi-Step-Task] Finished executing #{job_module_name} job for #{task_id} at #{Time.now}, taking #{(Time.now - task.redis.get(job_start_key).to_i).to_i} seconds.")
|
93
105
|
rescue Exception => e
|
106
|
+
logger.error("[Resque Multi-Step-Task] #{job_module_name} job failed for #{task_id} at #{Time.now} (args: #{args})")
|
94
107
|
task.increment_failed_count
|
95
108
|
raise
|
96
109
|
end
|
@@ -102,6 +115,14 @@ module Resque
|
|
102
115
|
perform_without_maybe_finalize(task_id, job_module_name, *args)
|
103
116
|
end
|
104
117
|
|
118
|
+
def logger=(logger)
|
119
|
+
@@logger = logger
|
120
|
+
end
|
121
|
+
|
122
|
+
def logger
|
123
|
+
@@logger ||= RAILS_DEFAULT_LOGGER || StdOutLogger.new
|
124
|
+
end
|
125
|
+
|
105
126
|
# Normally jobs that are part of a multi-step task are run
|
106
127
|
# asynchronously by putting them on a queue. However, it is
|
107
128
|
# often more convenient to just run the jobs synchronously as
|
@@ -128,6 +149,7 @@ module Resque
|
|
128
149
|
include Constantization
|
129
150
|
|
130
151
|
attr_reader :task_id
|
152
|
+
attr_accessor :logger
|
131
153
|
|
132
154
|
extend AtomicCounters
|
133
155
|
|
@@ -143,6 +165,11 @@ module Resque
|
|
143
165
|
# @param [String] task_id The UUID of the group of interest.
|
144
166
|
def initialize(task_id)
|
145
167
|
@task_id = task_id
|
168
|
+
redis.set 'start-time', Time.now.to_i
|
169
|
+
end
|
170
|
+
|
171
|
+
def logger
|
172
|
+
self.class.logger
|
146
173
|
end
|
147
174
|
|
148
175
|
def redis
|
@@ -171,6 +198,7 @@ module Resque
|
|
171
198
|
# @param [Class,Module] job_type The type of the job to be performed.
|
172
199
|
def add_job(job_type, *args)
|
173
200
|
increment_normal_job_count
|
201
|
+
logger.debug("[Resque Multi-Step-Task] Adding #{job_type} job for #{task_id} (args: #{args})")
|
174
202
|
|
175
203
|
if synchronous?
|
176
204
|
self.class.perform(task_id, job_type.to_s, *args)
|
@@ -186,6 +214,7 @@ module Resque
|
|
186
214
|
# @param [Class,Module] job_type The type of job to be performed.
|
187
215
|
def add_finalization_job(job_type, *args)
|
188
216
|
increment_finalize_job_count
|
217
|
+
logger.debug("[Resque Multi-Step-Task] Adding #{job_type} finalization job for #{task_id} (args: #{args})")
|
189
218
|
|
190
219
|
redis.rpush 'finalize_jobs', Yajl::Encoder.encode([job_type.to_s, *args])
|
191
220
|
end
|
@@ -217,6 +246,7 @@ module Resque
|
|
217
246
|
# @raise [FinalizationAlreadyBegun] If some other process has
|
218
247
|
# already started (and/or finished) the finalization process.
|
219
248
|
def finalize!
|
249
|
+
logger.debug("[Resque Multi-Step-Task] Attempting to finalize #{task_id}")
|
220
250
|
raise FinalizationAlreadyBegun unless MultiStepTask.active?(task_id)
|
221
251
|
raise NotReadyForFinalization if !ready_for_finalization? || incomplete_because_of_errors?
|
222
252
|
|
@@ -233,6 +263,7 @@ module Resque
|
|
233
263
|
Resque::Job.create(queue_name, FinalizationJob, self.task_id, *fin_job_info)
|
234
264
|
else
|
235
265
|
# There is nothing left to do so cleanup.
|
266
|
+
logger.debug "[Resque Multi-Step-Task] \"#{task_id}\" finalized successfully at #{Time.now}, taking #{(Time.now - redis.get('start-time').to_i).to_i} seconds."
|
236
267
|
nuke
|
237
268
|
end
|
238
269
|
end
|
@@ -243,6 +274,8 @@ module Resque
|
|
243
274
|
job_class_name, *args = Yajl::Parser.parse(fin_job_info)
|
244
275
|
self.class.perform_finalization(task_id, job_class_name, *args)
|
245
276
|
end
|
277
|
+
|
278
|
+
logger.debug "[Resque Multi-Step-Task] \"#{task_id}\" finalized successfully at #{Time.now}, taking #{(Time.now - redis.get('start-time').to_i).to_i} seconds."
|
246
279
|
nuke
|
247
280
|
end
|
248
281
|
|
data/resque-multi-step.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{resque-multi-step}
|
8
|
-
s.version = "1.0
|
8
|
+
s.version = "1.1.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Peter Williams", "Morgan Whitney"]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-02-18}
|
13
13
|
s.description = %q{Provides multi-step tasks with finalization and progress tracking}
|
14
14
|
s.email = %q{pezra@barelyenough.org}
|
15
15
|
s.extra_rdoc_files = [
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: resque-multi-step
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
-
- 0
|
9
8
|
- 1
|
10
|
-
|
9
|
+
- 0
|
10
|
+
version: 1.1.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Peter Williams
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2011-
|
19
|
+
date: 2011-02-18 00:00:00 -07:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|