beanstalk-client 1.1.0 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +0 -1
- data/README.md +18 -0
- data/VERSION +1 -1
- data/lib/beanstalk-client/connection.rb +19 -6
- data/test/test_beanstalk-client.rb +80 -0
- metadata +24 -43
- data/README.rdoc +0 -20
data/.gitignore
CHANGED
data/README.md
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
Beanstalk Ruby Client
|
2
|
+
=====================
|
3
|
+
|
4
|
+
Beanstalk is a simple, fast work queue. Its interface is generic, but was
|
5
|
+
originally designed for reducing the latency of page views in high-volume web
|
6
|
+
applications by running time-consuming tasks asynchronously.
|
7
|
+
|
8
|
+
For more information, see:
|
9
|
+
|
10
|
+
- <http://kr.github.com/beanstalkd/>
|
11
|
+
- <http://github.com/kr/beanstalkd/raw/master/doc/protocol.txt>
|
12
|
+
|
13
|
+
## Contributors
|
14
|
+
|
15
|
+
- Isaac Feliu
|
16
|
+
- Peter Kieltyka
|
17
|
+
- Martyn Loughran
|
18
|
+
- Dustin Sallings
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.1.
|
1
|
+
1.1.1
|
@@ -27,6 +27,7 @@ module Beanstalk
|
|
27
27
|
|
28
28
|
def initialize(addr, default_tube=nil)
|
29
29
|
@mutex = Mutex.new
|
30
|
+
@tube_mutex = Mutex.new
|
30
31
|
@waiting = false
|
31
32
|
@addr = addr
|
32
33
|
connect
|
@@ -53,8 +54,8 @@ module Beanstalk
|
|
53
54
|
pri = pri.to_i
|
54
55
|
delay = delay.to_i
|
55
56
|
ttr = ttr.to_i
|
56
|
-
body = body
|
57
|
-
interact("put #{pri} #{delay} #{ttr} #{body.
|
57
|
+
body = "#{body}" # Make sure that body.bytesize gives a useful number
|
58
|
+
interact("put #{pri} #{delay} #{ttr} #{body.bytesize}\r\n#{body}\r\n",
|
58
59
|
%w(INSERTED BURIED))[0].to_i
|
59
60
|
end
|
60
61
|
|
@@ -78,6 +79,14 @@ module Beanstalk
|
|
78
79
|
interact("peek-buried\r\n", :job)
|
79
80
|
end
|
80
81
|
|
82
|
+
def on_tube(tube, &block)
|
83
|
+
@tube_mutex.lock
|
84
|
+
use tube
|
85
|
+
yield self
|
86
|
+
ensure
|
87
|
+
@tube_mutex.unlock
|
88
|
+
end
|
89
|
+
|
81
90
|
def reserve(timeout=nil)
|
82
91
|
raise WaitingForJobError if @waiting
|
83
92
|
@mutex.lock
|
@@ -289,6 +298,10 @@ module Beanstalk
|
|
289
298
|
send_to_rand_conn(:yput, obj, pri, delay, ttr)
|
290
299
|
end
|
291
300
|
|
301
|
+
def on_tube(tube, &block)
|
302
|
+
send_to_rand_conn(:on_tube, tube, &block)
|
303
|
+
end
|
304
|
+
|
292
305
|
# Reserve a job from the queue.
|
293
306
|
#
|
294
307
|
# == Parameters
|
@@ -376,9 +389,9 @@ module Beanstalk
|
|
376
389
|
|
377
390
|
private
|
378
391
|
|
379
|
-
def call_wrap(c, *args)
|
392
|
+
def call_wrap(c, *args, &block)
|
380
393
|
self.last_conn = c
|
381
|
-
c.send(*args)
|
394
|
+
c.send(*args, &block)
|
382
395
|
rescue UnexpectedResponse => ex
|
383
396
|
raise ex
|
384
397
|
rescue EOFError, Errno::ECONNRESET, Errno::EPIPE => ex
|
@@ -401,9 +414,9 @@ module Beanstalk
|
|
401
414
|
retry_wrap{open_connections.inject(nil) {|r,c| r or call_wrap(c, *args)}}
|
402
415
|
end
|
403
416
|
|
404
|
-
def send_to_rand_conn(*args)
|
417
|
+
def send_to_rand_conn(*args, &block)
|
405
418
|
connect()
|
406
|
-
retry_wrap{call_wrap(pick_connection, *args)}
|
419
|
+
retry_wrap{call_wrap(pick_connection, *args, &block)}
|
407
420
|
end
|
408
421
|
|
409
422
|
def send_to_all_conns(*args)
|
@@ -4,4 +4,84 @@ class TestBeanstalkClient < Test::Unit::TestCase
|
|
4
4
|
def test_truth
|
5
5
|
assert true
|
6
6
|
end
|
7
|
+
|
8
|
+
def setup
|
9
|
+
@beanstalk = Beanstalk::Pool.new(['127.0.0.1:11300'])
|
10
|
+
@tubes = ['one', 'two']
|
11
|
+
|
12
|
+
# Put something on each tube so they exist
|
13
|
+
@beanstalk.use('one')
|
14
|
+
@beanstalk.put('one')
|
15
|
+
|
16
|
+
@beanstalk.use('two')
|
17
|
+
@beanstalk.put('two')
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_not_thread_safe
|
21
|
+
# Create threads that will execute
|
22
|
+
# A: use one
|
23
|
+
# B: use one
|
24
|
+
# B: put two
|
25
|
+
# A: put one
|
26
|
+
a = Thread.new do
|
27
|
+
@beanstalk.use('one')
|
28
|
+
sleep 4
|
29
|
+
@beanstalk.put('one')
|
30
|
+
end
|
31
|
+
|
32
|
+
b = Thread.new do
|
33
|
+
sleep 1
|
34
|
+
@beanstalk.use('two')
|
35
|
+
@beanstalk.put('two')
|
36
|
+
end
|
37
|
+
|
38
|
+
a.join
|
39
|
+
b.join
|
40
|
+
|
41
|
+
one = @beanstalk.stats_tube 'one'
|
42
|
+
two = @beanstalk.stats_tube 'two'
|
43
|
+
|
44
|
+
assert_equal one['current-jobs-ready'], 1
|
45
|
+
assert_equal two['current-jobs-ready'], 3
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_thread_safe
|
49
|
+
a = Thread.new do
|
50
|
+
@beanstalk.on_tube('one') do |conn|
|
51
|
+
sleep 4
|
52
|
+
conn.put('one')
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
b = Thread.new do
|
57
|
+
@beanstalk.on_tube('two') do |conn|
|
58
|
+
sleep 1
|
59
|
+
conn.put('two')
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
a.join
|
64
|
+
b.join
|
65
|
+
|
66
|
+
one = @beanstalk.stats_tube 'one'
|
67
|
+
two = @beanstalk.stats_tube 'two'
|
68
|
+
|
69
|
+
assert_equal one['current-jobs-ready'], 2
|
70
|
+
assert_equal two['current-jobs-ready'], 2
|
71
|
+
end
|
72
|
+
|
73
|
+
def teardown
|
74
|
+
# Clear the tubes
|
75
|
+
@tubes.each do |tube|
|
76
|
+
stats = @beanstalk.stats_tube tube
|
77
|
+
num_jobs = stats['current-jobs-ready']
|
78
|
+
@beanstalk.watch tube
|
79
|
+
num_jobs.times do
|
80
|
+
job = @beanstalk.reserve
|
81
|
+
job.delete
|
82
|
+
end
|
83
|
+
@beanstalk.ignore tube
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
7
87
|
end
|
metadata
CHANGED
@@ -1,37 +1,27 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: beanstalk-client
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 1
|
8
|
-
- 1
|
9
|
-
- 0
|
10
|
-
version: 1.1.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.1.1
|
5
|
+
prerelease:
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Keith Rarick
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
date: 2010-08-20 00:00:00 -07:00
|
19
|
-
default_executable:
|
12
|
+
date: 2010-08-20 00:00:00.000000000Z
|
20
13
|
dependencies: []
|
21
|
-
|
22
14
|
description: Ruby client for beanstalkd
|
23
15
|
email: kr@xph.us
|
24
16
|
executables: []
|
25
|
-
|
26
17
|
extensions: []
|
27
|
-
|
28
|
-
extra_rdoc_files:
|
18
|
+
extra_rdoc_files:
|
29
19
|
- LICENSE
|
30
|
-
- README.
|
31
|
-
files:
|
20
|
+
- README.md
|
21
|
+
files:
|
32
22
|
- .gitignore
|
33
23
|
- LICENSE
|
34
|
-
- README.
|
24
|
+
- README.md
|
35
25
|
- Rakefile
|
36
26
|
- VERSION
|
37
27
|
- lib/beanstalk-client.rb
|
@@ -45,40 +35,31 @@ files:
|
|
45
35
|
- website/javascripts/rounded_corners_lite.inc.js
|
46
36
|
- website/stylesheets/screen.css
|
47
37
|
- website/template.rhtml
|
48
|
-
has_rdoc: true
|
49
38
|
homepage: http://github.com/kr/beanstalk-client-ruby
|
50
39
|
licenses: []
|
51
|
-
|
52
40
|
post_install_message:
|
53
|
-
rdoc_options:
|
41
|
+
rdoc_options:
|
54
42
|
- --charset=UTF-8
|
55
|
-
require_paths:
|
43
|
+
require_paths:
|
56
44
|
- lib
|
57
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
45
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
58
46
|
none: false
|
59
|
-
requirements:
|
60
|
-
- -
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
|
63
|
-
|
64
|
-
- 0
|
65
|
-
version: "0"
|
66
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - ! '>='
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '0'
|
51
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
67
52
|
none: false
|
68
|
-
requirements:
|
69
|
-
- -
|
70
|
-
- !ruby/object:Gem::Version
|
71
|
-
|
72
|
-
segments:
|
73
|
-
- 0
|
74
|
-
version: "0"
|
53
|
+
requirements:
|
54
|
+
- - ! '>='
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
75
57
|
requirements: []
|
76
|
-
|
77
58
|
rubyforge_project:
|
78
|
-
rubygems_version: 1.
|
59
|
+
rubygems_version: 1.8.10
|
79
60
|
signing_key:
|
80
61
|
specification_version: 3
|
81
62
|
summary: Ruby client for beanstalkd
|
82
|
-
test_files:
|
63
|
+
test_files:
|
83
64
|
- test/helper.rb
|
84
65
|
- test/test_beanstalk-client.rb
|
data/README.rdoc
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
= Beanstalk Ruby Client
|
2
|
-
By: Keith Rarick
|
3
|
-
|
4
|
-
Beanstalk is a simple, fast workqueue service. Its interface is generic, but was originally designed for reducing the latency of page views in high-volume web applications by running time-consuming tasks asynchronously.
|
5
|
-
|
6
|
-
For more information see:
|
7
|
-
- http://kr.github.com/beanstalkd/
|
8
|
-
- http://github.com/kr/beanstalkd/blob/master/doc/protocol.txt?raw=true
|
9
|
-
|
10
|
-
= Notes
|
11
|
-
|
12
|
-
== Multiple Threads
|
13
|
-
|
14
|
-
If you want to use this library from multiple concurrent threads, you should synchronize access to the connection. This library does no internal synchronization.
|
15
|
-
|
16
|
-
= Contributors
|
17
|
-
- Isaac Feliu
|
18
|
-
- Peter Kieltyka
|
19
|
-
- Martyn Loughran
|
20
|
-
- Dustin Sallings
|