Skip to content

Commit 5d7d26f

Browse files
committed
compensate for lack of ordered hash in ruby 1.8
1 parent 2bf3e97 commit 5d7d26f

File tree

2 files changed

+43
-6
lines changed

2 files changed

+43
-6
lines changed

lib/resque/multi_queue.rb

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,14 @@ class MultiQueue
1414
def initialize(queues, redis)
1515
super()
1616

17-
@queues = {}
18-
@redis = redis
17+
@queues = queues # since ruby 1.8 doesn't have Ordered Hashes
18+
@queue_hash = {}
19+
@redis = redis
1920

2021
queues.each do |queue|
2122
key = @redis.is_a?(Redis::Namespace) ? "#{@redis.namespace}:" : ""
2223
key += queue.redis_name
23-
@queues[key] = queue
24+
@queue_hash[key] = queue
2425
end
2526
end
2627

@@ -34,7 +35,7 @@ def pop(non_block = false)
3435
synchronize do
3536
value = nil
3637

37-
@queues.values.each do |queue|
38+
@queues.each do |queue|
3839
begin
3940
return [queue, queue.pop(true)]
4041
rescue ThreadError
@@ -44,11 +45,11 @@ def pop(non_block = false)
4445
raise ThreadError
4546
end
4647
else
47-
queue_names = @queues.values.map {|queue| queue.redis_name }
48+
queue_names = @queues.map {|queue| queue.redis_name }
4849
synchronize do
4950
value = @redis.blpop(*(queue_names + [1])) until value
5051
queue_name, payload = value
51-
queue = @queues[queue_name]
52+
queue = @queue_hash[queue_name]
5253
[queue, queue.decode(payload)]
5354
end
5455
end

test/multi_queue_test.rb

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,40 @@
4949
Timeout::timeout(2) { queue.pop }
5050
end
5151
end
52+
53+
it "blocking pop processes queues in the order given" do
54+
foo = Resque::Queue.new 'foo', redis, coder
55+
bar = Resque::Queue.new 'bar', redis, coder
56+
baz = Resque::Queue.new 'baz', redis, coder
57+
queues = [foo, bar, baz]
58+
queue = Resque::MultiQueue.new(queues, redis)
59+
job = { 'class' => 'GoodJob', 'args' => [35, 'tar'] }
60+
61+
queues.each {|q| q << job }
62+
63+
processed_queues = queues.map do
64+
q, j = queue.pop
65+
q
66+
end
67+
68+
assert_equal processed_queues, queues
69+
end
70+
71+
it "nonblocking pop processes queues in the order given" do
72+
foo = Resque::Queue.new 'foo', redis, coder
73+
bar = Resque::Queue.new 'bar', redis, coder
74+
baz = Resque::Queue.new 'baz', redis, coder
75+
queues = [foo, bar, baz]
76+
queue = Resque::MultiQueue.new(queues, redis)
77+
job = { 'class' => 'GoodJob', 'args' => [35, 'tar'] }
78+
79+
queues.each {|q| q << job }
80+
81+
processed_queues = queues.map do
82+
q, j = queue.pop(true)
83+
q
84+
end
85+
86+
assert_equal processed_queues, queues
87+
end
5288
end

0 commit comments

Comments
 (0)