File tree Expand file tree Collapse file tree 2 files changed +141
-0
lines changed Expand file tree Collapse file tree 2 files changed +141
-0
lines changed Original file line number Diff line number Diff line change
1
+ require 'redis'
2
+ require 'redis-namespace'
3
+ require 'thread'
4
+ require 'mutex_m'
5
+
6
+ module Resque
7
+ class Queue
8
+ include Mutex_m
9
+
10
+ VERSION = '1.0.0'
11
+
12
+ def initialize name , redis , coder = Marshal
13
+ super ( )
14
+ @name = "queue:#{ name } "
15
+ @redis = redis
16
+ @coder = coder
17
+ end
18
+
19
+ def push object
20
+ synchronize do
21
+ @redis . rpush @name , encode ( object )
22
+ end
23
+ end
24
+
25
+ alias :<< :push
26
+ alias :enq :push
27
+
28
+ def pop non_block = false
29
+ if non_block
30
+ synchronize do
31
+ value = @redis . rpop ( @name )
32
+ raise ThreadError unless value
33
+ decode value
34
+ end
35
+ else
36
+ synchronize do
37
+ value = @redis . brpop ( @name , 1 ) until value
38
+ decode value . last
39
+ end
40
+ end
41
+ end
42
+
43
+ def length
44
+ @redis . llen @name
45
+ end
46
+ alias :size :length
47
+
48
+ def empty?
49
+ size == 0
50
+ end
51
+
52
+ private
53
+ def encode object
54
+ @coder . dump object
55
+ end
56
+
57
+ def decode object
58
+ @coder . load object
59
+ end
60
+ end
61
+ end
Original file line number Diff line number Diff line change
1
+ require 'test_helper'
2
+ require 'resque/queue'
3
+
4
+ module Resque
5
+ class TestQueue < MiniTest ::Unit ::TestCase
6
+ class Thing
7
+ attr_reader :inside
8
+
9
+ def initialize
10
+ @inside = "x"
11
+ end
12
+
13
+ def == other
14
+ super || @inside == other . inside
15
+ end
16
+ end
17
+
18
+ def test_sanity
19
+ queue = q
20
+ x = Thing . new
21
+ queue . push x
22
+ assert_equal x , queue . pop
23
+ end
24
+
25
+ def test_pop_blocks
26
+ queue1 = q
27
+ queue2 = q
28
+
29
+ t = Thread . new { queue1 . pop }
30
+ x = Thing . new
31
+
32
+ queue2 . push x
33
+ assert_equal x , t . join . value
34
+ end
35
+
36
+ def test_nonblock_pop
37
+ queue1 = q
38
+
39
+ assert_raises ThreadError do
40
+ queue1 . pop ( true )
41
+ end
42
+ end
43
+
44
+ def test_pop_blocks_forever
45
+ queue1 = q
46
+ assert_raises Timeout ::Error do
47
+ Timeout . timeout ( 2 ) { queue1 . pop }
48
+ end
49
+ end
50
+
51
+ def test_size
52
+ queue = q
53
+ assert_equal 0 , queue . size
54
+
55
+ queue << Thing . new
56
+ assert_equal 1 , queue . size
57
+ ensure
58
+ queue . pop
59
+ end
60
+
61
+ def test_empty?
62
+ queue = q
63
+ assert queue . empty?
64
+
65
+ queue << Thing . new
66
+ refute queue . empty?
67
+ ensure
68
+ queue . pop
69
+ end
70
+
71
+ def q
72
+ Queue . new 'foo' , backend
73
+ end
74
+
75
+ def backend
76
+ redis = Redis . new ( :host => "127.0.0.1" , :port => 9736 )
77
+ Redis ::Namespace . new :resque , :redis => redis
78
+ end
79
+ end
80
+ end
You can’t perform that action at this time.
0 commit comments