resque-scheduler 2.0.0.a → 2.0.0.b
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of resque-scheduler might be problematic. Click here for more details.
- data/HISTORY.md +5 -0
- data/lib/resque/scheduler.rb +22 -18
- data/lib/resque_scheduler.rb +11 -0
- data/lib/resque_scheduler/server/views/scheduler.erb +7 -3
- data/lib/resque_scheduler/version.rb +1 -1
- data/test/delayed_queue_test.rb +9 -0
- data/test/scheduler_test.rb +5 -0
- metadata +3 -3
data/HISTORY.md
CHANGED
@@ -3,6 +3,11 @@
|
|
3
3
|
* Dynamic schedule support (brianjlandau, davidyang)
|
4
4
|
* Now depends on redis >=1.3
|
5
5
|
|
6
|
+
## 1.9.8 (???)
|
7
|
+
|
8
|
+
* Validates delayed jobs prior to insertion into the delayed queue (bogdan)
|
9
|
+
* Rescue exceptions that occur during queuing and log them (dgrijalva)
|
10
|
+
|
6
11
|
## 1.9.7 (2010-11-09)
|
7
12
|
|
8
13
|
* Support for rufus-scheduler "every" syntax (fallwith)
|
data/lib/resque/scheduler.rb
CHANGED
@@ -62,6 +62,9 @@ module Resque
|
|
62
62
|
# Pulls the schedule from Resque.schedule and loads it into the
|
63
63
|
# rufus scheduler instance
|
64
64
|
def load_schedule!
|
65
|
+
# Need to load the schedule from redis for the first time if dynamic
|
66
|
+
Resque.reload_schedule! if dynamic
|
67
|
+
|
65
68
|
log! "Schedule empty! Set Resque.schedule" if Resque.schedule.empty?
|
66
69
|
|
67
70
|
@@scheduled_jobs = {}
|
@@ -129,14 +132,7 @@ module Resque
|
|
129
132
|
handle_shutdown do
|
130
133
|
if item = Resque.next_item_for_timestamp(timestamp)
|
131
134
|
log "queuing #{item['class']} [delayed]"
|
132
|
-
|
133
|
-
# Support custom job classes like job with status
|
134
|
-
if (job_klass = item['custom_job_class']) && (job_klass != 'Resque::Job')
|
135
|
-
# custom job classes not supporting the same API calls must implement the #schedule method
|
136
|
-
constantize(job_klass).scheduled(queue, item['class'], *item['args'])
|
137
|
-
else
|
138
|
-
Resque::Job.create(queue, item['class'], *item['args'])
|
139
|
-
end
|
135
|
+
enqueue_from_config(item)
|
140
136
|
end
|
141
137
|
end
|
142
138
|
# continue processing until there are no more ready items in this timestamp
|
@@ -150,18 +146,27 @@ module Resque
|
|
150
146
|
end
|
151
147
|
|
152
148
|
# Enqueues a job based on a config hash
|
153
|
-
def enqueue_from_config(
|
154
|
-
args =
|
155
|
-
klass_name =
|
149
|
+
def enqueue_from_config(job_config)
|
150
|
+
args = job_config['args'] || job_config[:args]
|
151
|
+
klass_name = job_config['class'] || job_config[:class]
|
156
152
|
params = args.is_a?(Hash) ? [args] : Array(args)
|
157
|
-
queue =
|
158
|
-
# Support custom job classes like
|
159
|
-
if (job_klass =
|
160
|
-
# custom job
|
161
|
-
|
153
|
+
queue = job_config['queue'] || job_config[:queue] || Resque.queue_from_class(constantize(klass_name))
|
154
|
+
# Support custom job classes like those that inherit from Resque::JobWithStatus (resque-status)
|
155
|
+
if (job_klass = job_config['custom_job_class']) && (job_klass != 'Resque::Job')
|
156
|
+
# The custom job class API must offer a static "scheduled" method. If the custom
|
157
|
+
# job class can not be constantized (via a requeue call from the web perhaps), fall
|
158
|
+
# back to enqueing normally via Resque::Job.create.
|
159
|
+
begin
|
160
|
+
constantize(job_klass).scheduled(queue, klass_name, *params)
|
161
|
+
rescue NameError
|
162
|
+
# Note that the custom job class (job_config['custom_job_class']) is the one enqueued
|
163
|
+
Resque::Job.create(queue, job_klass, *params)
|
164
|
+
end
|
162
165
|
else
|
163
166
|
Resque::Job.create(queue, klass_name, *params)
|
164
167
|
end
|
168
|
+
rescue
|
169
|
+
log! "Failed to enqueue #{klass_name}:\n #{$!}"
|
165
170
|
end
|
166
171
|
|
167
172
|
def rufus_scheduler
|
@@ -180,7 +185,6 @@ module Resque
|
|
180
185
|
def reload_schedule!
|
181
186
|
procline "Reloading Schedule"
|
182
187
|
clear_schedule!
|
183
|
-
Resque.reload_schedule!
|
184
188
|
load_schedule!
|
185
189
|
end
|
186
190
|
|
@@ -232,8 +236,8 @@ module Resque
|
|
232
236
|
end
|
233
237
|
|
234
238
|
def procline(string)
|
239
|
+
log! string
|
235
240
|
$0 = "resque-scheduler-#{ResqueScheduler::Version}: #{string}"
|
236
|
-
log! $0
|
237
241
|
end
|
238
242
|
|
239
243
|
end
|
data/lib/resque_scheduler.rb
CHANGED
@@ -85,6 +85,7 @@ module ResqueScheduler
|
|
85
85
|
# for queueing. Until timestamp is in the past, the job will
|
86
86
|
# sit in the schedule list.
|
87
87
|
def enqueue_at(timestamp, klass, *args)
|
88
|
+
validate_job!(klass)
|
88
89
|
delayed_push(timestamp, job_to_hash(klass, args))
|
89
90
|
end
|
90
91
|
|
@@ -194,6 +195,16 @@ module ResqueScheduler
|
|
194
195
|
end
|
195
196
|
end
|
196
197
|
|
198
|
+
def validate_job!(klass)
|
199
|
+
if klass.to_s.empty?
|
200
|
+
raise Resque::NoClassError.new("Jobs must be given a class.")
|
201
|
+
end
|
202
|
+
|
203
|
+
unless queue_from_class(klass)
|
204
|
+
raise Resque::NoQueueError.new("Jobs must be placed onto a queue.")
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
197
208
|
end
|
198
209
|
|
199
210
|
Resque.extend ResqueScheduler
|
@@ -26,9 +26,13 @@
|
|
26
26
|
</td>
|
27
27
|
<td><%= h name %></td>
|
28
28
|
<td><%= h config['description'] %></td>
|
29
|
-
<td style="white-space:nowrap"><%=
|
30
|
-
|
31
|
-
|
29
|
+
<td style="white-space:nowrap"><%= if !config['every'].nil?
|
30
|
+
h('every: ' + config['every'])
|
31
|
+
elsif !config['cron'].nil?
|
32
|
+
h('cron: ' + config['cron'])
|
33
|
+
else
|
34
|
+
'Not currently scheduled'
|
35
|
+
end %></td>
|
32
36
|
<td><%= (config['class'].nil? && !config['custom_job_class'].nil?) ?
|
33
37
|
h(config['custom_job_class']) :
|
34
38
|
h(config['class']) %></td>
|
data/test/delayed_queue_test.rb
CHANGED
@@ -217,4 +217,13 @@ class Resque::DelayedQueueTest < Test::Unit::TestCase
|
|
217
217
|
assert_equal(2, Resque.remove_delayed(SomeIvarJob, "bar"))
|
218
218
|
assert_equal(2, Resque.count_all_scheduled_jobs)
|
219
219
|
end
|
220
|
+
|
221
|
+
def test_invalid_job_class
|
222
|
+
assert_raise Resque::NoClassError do
|
223
|
+
Resque.enqueue_in(10, nil)
|
224
|
+
end
|
225
|
+
assert_raise Resque::NoQueueError do
|
226
|
+
Resque.enqueue_in(10, String) # string serves as invalid Job class
|
227
|
+
end
|
228
|
+
end
|
220
229
|
end
|
data/test/scheduler_test.rb
CHANGED
@@ -25,6 +25,11 @@ class Resque::SchedulerTest < Test::Unit::TestCase
|
|
25
25
|
Resque::Scheduler.enqueue_from_config('every' => '1m', 'class' => 'JamesJob', 'args' => '/tmp', 'queue' => 'james_queue')
|
26
26
|
end
|
27
27
|
|
28
|
+
def test_enqueue_from_config_doesnt_crash_on_exception_when_enqueueing
|
29
|
+
Resque::Job.stubs(:create).raises(Resque::NoQueueError, 'test exception').with(:ivar, 'SomeIvarJob', '/tmp')
|
30
|
+
Resque::Scheduler.enqueue_from_config('cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp")
|
31
|
+
end
|
32
|
+
|
28
33
|
def test_enqueue_from_config_puts_stuff_in_the_resque_queue
|
29
34
|
Resque::Job.stubs(:create).once.returns(true).with(:ivar, 'SomeIvarJob', '/tmp')
|
30
35
|
Resque::Scheduler.enqueue_from_config('cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp")
|
metadata
CHANGED
@@ -6,8 +6,8 @@ version: !ruby/object:Gem::Version
|
|
6
6
|
- 2
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 2.0.0.
|
9
|
+
- b
|
10
|
+
version: 2.0.0.b
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Ben VandenBos
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2011-02-25 00:00:00 -08:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|