Skip to content

Commit 5042244

Browse files
author
humancopy
committed
Add before & after dequeue hooks.
1 parent 11f3fac commit 5042244

File tree

3 files changed

+82
-0
lines changed

3 files changed

+82
-0
lines changed

lib/resque.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,17 @@ def enqueue(klass, *args)
265265
#
266266
# This method is considered part of the `stable` API.
267267
def dequeue(klass, *args)
268+
# Perform before_dequeue hooks. Don't perform dequeue if any hook returns false
269+
before_hooks = Plugin.before_dequeue_hooks(klass).collect do |hook|
270+
klass.send(hook, *args)
271+
end
272+
return if before_hooks.any? { |result| result == false }
273+
268274
Job.destroy(queue_from_class(klass), klass, *args)
275+
276+
Plugin.after_dequeue_hooks(klass).each do |hook|
277+
klass.send(hook, *args)
278+
end
269279
end
270280

271281
# Given a class, try to extrapolate an appropriate queue based on a

lib/resque/plugin.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,5 +52,15 @@ def after_enqueue_hooks(job)
5252
def before_enqueue_hooks(job)
5353
job.methods.grep(/^before_enqueue/).sort
5454
end
55+
56+
# Given an object, returns a list `after_dequeue` hook names.
57+
def after_dequeue_hooks(job)
58+
job.methods.grep(/^after_dequeue/).sort
59+
end
60+
61+
# Given an object, returns a list `before_dequeue` hook names.
62+
def before_dequeue_hooks(job)
63+
job.methods.grep(/^before_dequeue/).sort
64+
end
5565
end
5666
end

test/job_hooks_test.rb

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,68 @@ def self.perform(history)
290290
end
291291
end
292292

293+
context "Resque::Job after_dequeue" do
294+
include PerformJob
295+
296+
class ::AfterDequeueJob
297+
@queue = :jobs
298+
def self.after_dequeue_record_history(history)
299+
history << :after_dequeue
300+
end
301+
302+
def self.perform(history)
303+
end
304+
end
305+
306+
test "the after dequeue hook should run" do
307+
history = []
308+
@worker = Resque::Worker.new(:jobs)
309+
Resque.dequeue(AfterDequeueJob, history)
310+
@worker.work(0)
311+
assert_equal history, [:after_dequeue], "after_dequeue was not run"
312+
end
313+
end
314+
315+
316+
context "Resque::Job before_dequeue" do
317+
include PerformJob
318+
319+
class ::BeforeDequeueJob
320+
@queue = :jobs
321+
def self.before_dequeue_record_history(history)
322+
history << :before_dequeue
323+
end
324+
325+
def self.perform(history)
326+
end
327+
end
328+
329+
class ::BeforeDequeueJobAbort
330+
@queue = :jobs
331+
def self.before_dequeue_abort(history)
332+
false
333+
end
334+
335+
def self.perform(history)
336+
end
337+
end
338+
339+
test "the before dequeue hook should run" do
340+
history = []
341+
@worker = Resque::Worker.new(:jobs)
342+
Resque.dequeue(BeforeDequeueJob, history)
343+
@worker.work(0)
344+
assert_equal history, [:before_dequeue], "before_dequeue was not run"
345+
end
346+
347+
test "a before dequeue hook that returns false should prevent the job from getting queued" do
348+
history = []
349+
@worker = Resque::Worker.new(:jobs)
350+
Resque.dequeue(BeforeDequeueJobAbort, history)
351+
assert_equal 0, Resque.size(:jobs)
352+
end
353+
end
354+
293355
context "Resque::Job all hooks" do
294356
include PerformJob
295357

0 commit comments

Comments
 (0)