Skip to content

Commit ca5b657

Browse files
committed
* Added Resque.dequeue(klass, *args)
1 parent 16738d8 commit ca5b657

File tree

4 files changed

+48
-6
lines changed

4 files changed

+48
-6
lines changed

HISTORY.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
* Version now included in procline, e.g. `resque-1.5.0: Message`
44
* Web bugfix: Ignore idle works in the "working" page
5+
* Added `Resque::Job.destroy(queue, klass, *args)`
6+
* Added `Resque.dequeue(klass, *args)`
57

68
## 1.4.0 (2010-02-11)
79

lib/resque.rb

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,13 +133,38 @@ def watch_queue(queue)
133133
# If either of those conditions are met, it will use the value obtained
134134
# from performing one of the above operations to determine the queue.
135135
#
136-
# If no queue can be inferred this method will return a non-true value.
136+
# If no queue can be inferred this method will raise a `Resque::NoQueueError`
137137
#
138138
# This method is considered part of the `stable` API.
139139
def enqueue(klass, *args)
140-
queue = klass.instance_variable_get(:@queue)
141-
queue ||= klass.queue if klass.respond_to?(:queue)
142-
Job.create(queue, klass, *args)
140+
Job.create(queue_from_class(klass), klass, *args)
141+
end
142+
143+
# This method can be used to conveniently remove a job from a queue.
144+
# It assumes the class you're passing it is a real Ruby class (not
145+
# a string or reference) which either:
146+
#
147+
# a) has a @queue ivar set
148+
# b) responds to `queue`
149+
#
150+
# If either of those conditions are met, it will use the value obtained
151+
# from performing one of the above operations to determine the queue.
152+
#
153+
# If no queue can be inferred this method will raise a `Resque::NoQueueError`
154+
#
155+
# If no args are given, this method will dequeue *all* jobs matching
156+
# the provided class. See `Resque::Job.destroy` for more information.
157+
#
158+
# This method is considered part of the `stable` API.
159+
def dequeue(klass, *args)
160+
Job.destroy(queue_from_class(klass), klass, *args)
161+
end
162+
163+
# Given a class, try to extrapolate an appropriate queue based on a
164+
# class instance variable or `queue` method.
165+
def queue_from_class(klass)
166+
klass.instance_variable_get(:@queue) ||
167+
(klass.respond_to?(:queue) and klass.queue)
143168
end
144169

145170
# This method will return a `Resque::Job` object or a non-true value

lib/resque/job.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def initialize(queue, payload)
3636
#
3737
# Raises an exception if no queue or class is given.
3838
def self.create(queue, klass, *args)
39-
if queue.to_s.empty?
39+
if !queue
4040
raise NoQueueError.new("Jobs must be placed onto a queue.")
4141
end
4242

test/resque_test.rb

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,28 @@
5050
assert_equal nil, Resque.reserve(:ivar)
5151
end
5252

53+
test "can remove jobs from a queue by way of an ivar" do
54+
assert_equal 0, Resque.size(:ivar)
55+
assert Resque.enqueue(SomeIvarJob, 20, '/tmp')
56+
assert Resque.enqueue(SomeIvarJob, 30, '/tmp')
57+
assert Resque.enqueue(SomeIvarJob, 20, '/tmp')
58+
assert Resque::Job.create(:ivar, 'blah-job', 20, '/tmp')
59+
assert Resque.enqueue(SomeIvarJob, 20, '/tmp')
60+
assert_equal 5, Resque.size(:ivar)
61+
62+
assert Resque.dequeue(SomeIvarJob, 30, '/tmp')
63+
assert_equal 4, Resque.size(:ivar)
64+
assert Resque.dequeue(SomeIvarJob)
65+
assert_equal 1, Resque.size(:ivar)
66+
end
67+
5368
test "jobs have a nice #inspect" do
5469
assert Resque::Job.create(:jobs, 'SomeJob', 20, '/tmp')
5570
job = Resque.reserve(:jobs)
5671
assert_equal '(Job{jobs} | SomeJob | [20, "/tmp"])', job.inspect
5772
end
5873

59-
test "jobs can be dropped from a queue" do
74+
test "jobs can be destroyed" do
6075
assert Resque::Job.create(:jobs, 'SomeJob', 20, '/tmp')
6176
assert Resque::Job.create(:jobs, 'BadJob', 20, '/tmp')
6277
assert Resque::Job.create(:jobs, 'SomeJob', 20, '/tmp')

0 commit comments

Comments
 (0)