bunny 0.9.0.rc2 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +3 -4
- data/Gemfile +2 -0
- data/README.md +2 -2
- data/examples/connection/manually_reconnecting_consumer.rb +23 -0
- data/examples/connection/manually_reconnecting_publisher.rb +28 -0
- data/lib/bunny/channel.rb +5 -7
- data/lib/bunny/session.rb +8 -1
- data/lib/bunny/version.rb +1 -1
- data/spec/higher_level_api/integration/basic_cancel_spec.rb +35 -2
- data/spec/higher_level_api/integration/basic_consume_spec.rb +1 -4
- data/spec/higher_level_api/integration/basic_publish_spec.rb +59 -57
- data/spec/higher_level_api/integration/exchange_declare_spec.rb +6 -0
- data/spec/higher_level_api/integration/merry_go_round_spec.rb +85 -0
- data/spec/higher_level_api/integration/publishing_edge_cases_spec.rb +41 -39
- data/spec/higher_level_api/integration/read_only_consumer_spec.rb +60 -0
- data/spec/unit/transport_spec.rb +12 -9
- metadata +10 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a6609fd8d343c1eec98e9da88ae45dfd5f4a8700
|
4
|
+
data.tar.gz: 44d923b952630e72f34c86f1301518b2c0f09dde
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 631b259c7c43c8718fc488f4d66324dea03adcce07677454283c2cb23158ca568f87e547e21e2002ff983827f5e6d65c90547a798e4c56ed6e6641e01cff3931
|
7
|
+
data.tar.gz: c2aaf955089270d06e50279b6ca1499afdf386767e6fb4f227e3b4ee60471fdc766b1f4e58a68188d0f2670491a9dbc109d9f86a712abc370208c3ab3ebe09ff
|
data/.travis.yml
CHANGED
@@ -4,12 +4,11 @@ script: "bundle exec rspec -c spec"
|
|
4
4
|
rvm:
|
5
5
|
- "2.0"
|
6
6
|
- "1.9.3"
|
7
|
-
- rbx-19mode
|
8
|
-
- jruby-19mode
|
7
|
+
- "rbx-19mode"
|
8
|
+
- "jruby-19mode"
|
9
9
|
- "1.9.2"
|
10
|
-
- "1.8.7"
|
11
10
|
notifications:
|
12
|
-
email: michael@
|
11
|
+
email: michael@rabbitmq.com
|
13
12
|
services:
|
14
13
|
- rabbitmq
|
15
14
|
branches:
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -83,12 +83,12 @@ To install Bunny 0.9.x with RubyGems:
|
|
83
83
|
gem install bunny --pre
|
84
84
|
```
|
85
85
|
|
86
|
-
the most recent 0.9.x version is `0.9.0.
|
86
|
+
the most recent 0.9.x version is `0.9.0.rc2`.
|
87
87
|
|
88
88
|
To use Bunny 0.9.x in a project managed with Bundler:
|
89
89
|
|
90
90
|
``` ruby
|
91
|
-
gem "bunny", ">= 0.9.0.
|
91
|
+
gem "bunny", ">= 0.9.0.rc2" # optionally: , :git => "git://github.com/ruby-amqp/bunny.git", :branch => "master"
|
92
92
|
```
|
93
93
|
|
94
94
|
|
@@ -0,0 +1,23 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'bunny'
|
3
|
+
|
4
|
+
Bundler.setup
|
5
|
+
|
6
|
+
begin
|
7
|
+
connection = Bunny.new(:automatically_recover => false)
|
8
|
+
connection.start
|
9
|
+
|
10
|
+
ch = connection.channel
|
11
|
+
q = ch.queue("manually_reconnecting_consumer", :exclusive => true)
|
12
|
+
|
13
|
+
q.subscribe(:block => true) do |_, _, payload|
|
14
|
+
puts "Consumed #{payload}"
|
15
|
+
end
|
16
|
+
rescue Bunny::NetworkFailure => e
|
17
|
+
ch.maybe_kill_consumer_work_pool!
|
18
|
+
|
19
|
+
sleep 10
|
20
|
+
puts "Recovering manually..."
|
21
|
+
|
22
|
+
retry
|
23
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'bunny'
|
3
|
+
|
4
|
+
Bundler.setup
|
5
|
+
|
6
|
+
begin
|
7
|
+
connection = Bunny.new(:automatically_recover => false)
|
8
|
+
connection.start
|
9
|
+
|
10
|
+
ch = connection.channel
|
11
|
+
x = ch.default_exchange
|
12
|
+
|
13
|
+
loop do
|
14
|
+
10.times do |i|
|
15
|
+
print "."
|
16
|
+
x.publish("")
|
17
|
+
end
|
18
|
+
|
19
|
+
sleep 3.0
|
20
|
+
end
|
21
|
+
rescue Bunny::NetworkFailure => e
|
22
|
+
ch.maybe_kill_consumer_work_pool!
|
23
|
+
|
24
|
+
sleep 10
|
25
|
+
puts "Recovering manually..."
|
26
|
+
|
27
|
+
retry
|
28
|
+
end
|
data/lib/bunny/channel.rb
CHANGED
@@ -43,8 +43,6 @@ module Bunny
|
|
43
43
|
#
|
44
44
|
# This will automatically allocate a channel id.
|
45
45
|
#
|
46
|
-
# @example Instantiating
|
47
|
-
#
|
48
46
|
# ## Closing Channels
|
49
47
|
#
|
50
48
|
# Channels are closed via {Bunny::Channel#close}. Channels that get a channel-level exception are
|
@@ -371,15 +369,15 @@ module Bunny
|
|
371
369
|
|
372
370
|
# @group Higher-level API for queue operations
|
373
371
|
|
374
|
-
# Declares
|
372
|
+
# Declares a queue or looks it up in the per-channel cache.
|
375
373
|
#
|
376
374
|
# @param [String] name Queue name. Pass an empty string to declare a server-named queue (make RabbitMQ generate a unique name).
|
377
375
|
# @param [Hash] opts Queue properties and other options
|
378
376
|
#
|
379
|
-
# @option
|
380
|
-
# @option
|
381
|
-
# @option
|
382
|
-
# @option
|
377
|
+
# @option opts [Boolean] :durable (false) Should this queue be durable?
|
378
|
+
# @option opts [Boolean] :auto-delete (false) Should this queue be automatically deleted when the last consumer disconnects?
|
379
|
+
# @option opts [Boolean] :exclusive (false) Should this queue be exclusive (only can be used by this connection, removed when the connection is closed)?
|
380
|
+
# @option opts [Boolean] :arguments ({}) Additional optional arguments (typically used by RabbitMQ extensions and plugins)
|
383
381
|
#
|
384
382
|
# @return [Bunny::Queue] Queue that was declared or looked up in the cache
|
385
383
|
# @see http://rubybunny.info/articles/queues.html Queues and Consumers guide
|
data/lib/bunny/session.rb
CHANGED
@@ -40,6 +40,13 @@ module Bunny
|
|
40
40
|
# @private
|
41
41
|
CONNECT_TIMEOUT = Transport::DEFAULT_CONNECTION_TIMEOUT
|
42
42
|
|
43
|
+
# @private
|
44
|
+
DEFAULT_CONTINUATION_TIMEOUT = if RUBY_VERSION.to_f < 1.9
|
45
|
+
8000
|
46
|
+
else
|
47
|
+
4000
|
48
|
+
end
|
49
|
+
|
43
50
|
# RabbitMQ client metadata
|
44
51
|
DEFAULT_CLIENT_PROPERTIES = {
|
45
52
|
:capabilities => {
|
@@ -124,7 +131,7 @@ module Bunny
|
|
124
131
|
end
|
125
132
|
@network_recovery_interval = opts.fetch(:network_recovery_interval, DEFAULT_NETWORK_RECOVERY_INTERVAL)
|
126
133
|
# in ms
|
127
|
-
@continuation_timeout = opts.fetch(:continuation_timeout,
|
134
|
+
@continuation_timeout = opts.fetch(:continuation_timeout, DEFAULT_CONTINUATION_TIMEOUT)
|
128
135
|
|
129
136
|
@status = :not_connected
|
130
137
|
|
data/lib/bunny/version.rb
CHANGED
@@ -11,9 +11,9 @@ describe Bunny::Consumer, "#cancel" do
|
|
11
11
|
connection.close if connection.open?
|
12
12
|
end
|
13
13
|
|
14
|
-
|
14
|
+
context "with a non-blocking consumer" do
|
15
|
+
let(:queue_name) { "bunny.queues.#{rand}" }
|
15
16
|
|
16
|
-
context "when the given consumer tag is valid" do
|
17
17
|
it "cancels the consumer" do
|
18
18
|
delivered_data = []
|
19
19
|
|
@@ -40,4 +40,37 @@ describe Bunny::Consumer, "#cancel" do
|
|
40
40
|
delivered_data.should be_empty
|
41
41
|
end
|
42
42
|
end
|
43
|
+
|
44
|
+
|
45
|
+
context "with a blocking consumer" do
|
46
|
+
let(:queue_name) { "bunny.queues.#{rand}" }
|
47
|
+
|
48
|
+
it "cancels the consumer" do
|
49
|
+
delivered_data = []
|
50
|
+
consumer = nil
|
51
|
+
|
52
|
+
t = Thread.new do
|
53
|
+
ch = connection.create_channel
|
54
|
+
q = ch.queue(queue_name, :auto_delete => true, :durable => false)
|
55
|
+
|
56
|
+
consumer = Bunny::Consumer.new(ch, q)
|
57
|
+
consumer.on_delivery do |_, _, payload|
|
58
|
+
delivered_data << payload
|
59
|
+
end
|
60
|
+
|
61
|
+
q.subscribe_with(consumer, :block => false)
|
62
|
+
end
|
63
|
+
t.abort_on_exception = true
|
64
|
+
sleep 0.5
|
65
|
+
|
66
|
+
consumer.cancel
|
67
|
+
sleep 0.5
|
68
|
+
|
69
|
+
ch = connection.create_channel
|
70
|
+
ch.default_exchange.publish("", :routing_key => queue_name)
|
71
|
+
|
72
|
+
sleep 0.7
|
73
|
+
delivered_data.should be_empty
|
74
|
+
end
|
75
|
+
end
|
43
76
|
end
|
@@ -128,19 +128,15 @@ describe Bunny::Queue, "#subscribe" do
|
|
128
128
|
ch = connection.create_channel
|
129
129
|
q = ch.queue(queue_name)
|
130
130
|
|
131
|
-
|
132
|
-
|
133
131
|
c1 = q.subscribe(:exclusive => false, :manual_ack => false, :block => false) do |delivery_info, properties, payload|
|
134
132
|
end
|
135
133
|
c1.cancel
|
136
|
-
puts "Cancelled #{c1.consumer_tag}"
|
137
134
|
|
138
135
|
c2 = q.subscribe(:exclusive => false, :manual_ack => false, :block => false) do |delivery_info, properties, payload|
|
139
136
|
delivered_keys << delivery_info.routing_key
|
140
137
|
delivered_data << payload
|
141
138
|
end
|
142
139
|
c2.cancel
|
143
|
-
puts "Cancelled #{c2.consumer_tag}"
|
144
140
|
|
145
141
|
q.subscribe(:exclusive => false, :manual_ack => false, :block => true) do |delivery_info, properties, payload|
|
146
142
|
delivered_keys << delivery_info.routing_key
|
@@ -160,6 +156,7 @@ describe Bunny::Queue, "#subscribe" do
|
|
160
156
|
|
161
157
|
ch.queue(queue_name).message_count.should == 0
|
162
158
|
|
159
|
+
ch.queue_delete(queue_name)
|
163
160
|
ch.close
|
164
161
|
end
|
165
162
|
end
|
@@ -1,87 +1,89 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
3
|
+
if RUBY_VERSION <= "1.9"
|
4
|
+
describe "Publishing a message to the default exchange" do
|
5
|
+
let(:connection) do
|
6
|
+
c = Bunny.new(:user => "bunny_gem", :password => "bunny_password", :vhost => "bunny_testbed")
|
7
|
+
c.start
|
8
|
+
c
|
9
|
+
end
|
9
10
|
|
10
|
-
|
11
|
-
|
12
|
-
|
11
|
+
after :all do
|
12
|
+
connection.close if connection.open?
|
13
|
+
end
|
13
14
|
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
context "with all default delivery and message properties" do
|
17
|
+
it "routes messages to a queue with the same name as the routing key" do
|
18
|
+
connection.should be_threaded
|
19
|
+
ch = connection.create_channel
|
19
20
|
|
20
|
-
|
21
|
-
|
21
|
+
q = ch.queue("", :exclusive => true)
|
22
|
+
x = ch.default_exchange
|
22
23
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
x.publish("xyzzy", :routing_key => q.name).
|
25
|
+
publish("xyzzy", :routing_key => q.name).
|
26
|
+
publish("xyzzy", :routing_key => q.name).
|
27
|
+
publish("xyzzy", :routing_key => q.name)
|
27
28
|
|
28
|
-
|
29
|
-
|
29
|
+
sleep(1)
|
30
|
+
q.message_count.should == 4
|
30
31
|
|
31
|
-
|
32
|
+
ch.close
|
33
|
+
end
|
32
34
|
end
|
33
|
-
end
|
34
35
|
|
35
36
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
37
|
+
context "with all default delivery and message properties" do
|
38
|
+
it "routes the messages and preserves all the metadata" do
|
39
|
+
connection.should be_threaded
|
40
|
+
ch = connection.create_channel
|
40
41
|
|
41
|
-
|
42
|
-
|
42
|
+
q = ch.queue("", :exclusive => true)
|
43
|
+
x = ch.default_exchange
|
43
44
|
|
44
|
-
|
45
|
+
x.publish("xyzzy", :routing_key => q.name, :persistent => true)
|
45
46
|
|
46
|
-
|
47
|
-
|
47
|
+
sleep(1)
|
48
|
+
q.message_count.should == 1
|
48
49
|
|
49
|
-
|
50
|
+
envelope, headers, payload = q.pop
|
50
51
|
|
51
|
-
|
52
|
+
payload.should == "xyzzy"
|
52
53
|
|
53
|
-
|
54
|
-
|
55
|
-
|
54
|
+
headers[:content_type].should == "application/octet-stream"
|
55
|
+
headers[:delivery_mode].should == 2
|
56
|
+
headers[:priority].should == 0
|
56
57
|
|
57
|
-
|
58
|
+
ch.close
|
59
|
+
end
|
58
60
|
end
|
59
|
-
end
|
60
61
|
|
61
62
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
63
|
+
context "with all default delivery and message properties on a single-threaded connection" do
|
64
|
+
let(:connection) do
|
65
|
+
c = Bunny.new(:user => "bunny_gem", :password => "bunny_password", :vhost => "bunny_testbed", :threaded => false)
|
66
|
+
c.start
|
67
|
+
c
|
68
|
+
end
|
68
69
|
|
69
|
-
|
70
|
-
|
71
|
-
|
70
|
+
it "routes messages to a queue with the same name as the routing key" do
|
71
|
+
connection.should_not be_threaded
|
72
|
+
ch = connection.create_channel
|
72
73
|
|
73
|
-
|
74
|
-
|
74
|
+
q = ch.queue("", :exclusive => true)
|
75
|
+
x = ch.default_exchange
|
75
76
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
77
|
+
x.publish("xyzzy", :routing_key => q.name).
|
78
|
+
publish("xyzzy", :routing_key => q.name).
|
79
|
+
publish("xyzzy", :routing_key => q.name).
|
80
|
+
publish("xyzzy", :routing_key => q.name)
|
80
81
|
|
81
|
-
|
82
|
-
|
82
|
+
sleep(1)
|
83
|
+
q.message_count.should == 4
|
83
84
|
|
84
|
-
|
85
|
+
ch.close
|
86
|
+
end
|
85
87
|
end
|
86
88
|
end
|
87
89
|
end
|
@@ -79,6 +79,8 @@ describe Bunny::Exchange do
|
|
79
79
|
x.should_not be_durable
|
80
80
|
x.should be_auto_delete
|
81
81
|
|
82
|
+
ch.exchange(name, :type => :fanout, :auto_delete => true)
|
83
|
+
|
82
84
|
x.delete
|
83
85
|
ch.close
|
84
86
|
end
|
@@ -112,6 +114,8 @@ describe Bunny::Exchange do
|
|
112
114
|
x = ch.direct(name)
|
113
115
|
x.name.should == name
|
114
116
|
|
117
|
+
ch.exchange(name, :type => :direct)
|
118
|
+
|
115
119
|
x.delete
|
116
120
|
ch.close
|
117
121
|
end
|
@@ -139,6 +143,8 @@ describe Bunny::Exchange do
|
|
139
143
|
x = ch.topic(name)
|
140
144
|
x.name.should == name
|
141
145
|
|
146
|
+
ch.exchange(name, :type => :topic)
|
147
|
+
|
142
148
|
x.delete
|
143
149
|
ch.close
|
144
150
|
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe "A message that is proxied by multiple intermediate consumers" do
|
4
|
+
let(:c1) do
|
5
|
+
c = Bunny.new(:user => "bunny_gem", :password => "bunny_password", :vhost => "bunny_testbed")
|
6
|
+
c.start
|
7
|
+
c
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:c2) do
|
11
|
+
c = Bunny.new(:user => "bunny_gem", :password => "bunny_password", :vhost => "bunny_testbed")
|
12
|
+
c.start
|
13
|
+
c
|
14
|
+
end
|
15
|
+
|
16
|
+
let(:c3) do
|
17
|
+
c = Bunny.new(:user => "bunny_gem", :password => "bunny_password", :vhost => "bunny_testbed")
|
18
|
+
c.start
|
19
|
+
c
|
20
|
+
end
|
21
|
+
|
22
|
+
let(:c4) do
|
23
|
+
c = Bunny.new(:user => "bunny_gem", :password => "bunny_password", :vhost => "bunny_testbed")
|
24
|
+
c.start
|
25
|
+
c
|
26
|
+
end
|
27
|
+
|
28
|
+
let(:c5) do
|
29
|
+
c = Bunny.new(:user => "bunny_gem", :password => "bunny_password", :vhost => "bunny_testbed")
|
30
|
+
c.start
|
31
|
+
c
|
32
|
+
end
|
33
|
+
|
34
|
+
after :all do
|
35
|
+
[c1, c2, c3, c4, c5].each do |c|
|
36
|
+
c.close if c.open?
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# message flow is as follows:
|
41
|
+
#
|
42
|
+
# x => q4 => q3 => q2 => q1 => xs (results)
|
43
|
+
it "reaches its final destination" do
|
44
|
+
n = 10000
|
45
|
+
xs = []
|
46
|
+
|
47
|
+
ch1 = c1.create_channel
|
48
|
+
q1 = ch1.queue("", :exclusive => true)
|
49
|
+
q1.subscribe do |_, _, payload|
|
50
|
+
xs << payload
|
51
|
+
end
|
52
|
+
|
53
|
+
ch2 = c2.create_channel
|
54
|
+
q2 = ch2.queue("", :exclusive => true)
|
55
|
+
q2.subscribe do |_, _, payload|
|
56
|
+
q1.publish(payload)
|
57
|
+
end
|
58
|
+
|
59
|
+
ch3 = c3.create_channel
|
60
|
+
q3 = ch2.queue("", :exclusive => true)
|
61
|
+
q3.subscribe do |_, _, payload|
|
62
|
+
q2.publish(payload)
|
63
|
+
end
|
64
|
+
|
65
|
+
ch4 = c4.create_channel
|
66
|
+
q4 = ch2.queue("", :exclusive => true)
|
67
|
+
q4.subscribe do |_, _, payload|
|
68
|
+
q3.publish(payload)
|
69
|
+
end
|
70
|
+
|
71
|
+
ch5 = c5.create_channel
|
72
|
+
x = ch5.default_exchange
|
73
|
+
|
74
|
+
n.times do |i|
|
75
|
+
x.publish("msg #{i}", :routing_key => q4.name)
|
76
|
+
end
|
77
|
+
|
78
|
+
t = n / 1000 * 3.0
|
79
|
+
puts "About to sleep for #{t} seconds..."
|
80
|
+
sleep(t)
|
81
|
+
|
82
|
+
xs.size.should == n
|
83
|
+
xs.last.should == "msg #{n - 1}"
|
84
|
+
end
|
85
|
+
end
|
@@ -1,63 +1,65 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
3
|
+
unless ENV["CI"]
|
4
|
+
describe "Message framing implementation" do
|
5
|
+
let(:connection) do
|
6
|
+
c = Bunny.new(:user => "bunny_gem",
|
7
|
+
:password => "bunny_password",
|
8
|
+
:vhost => "bunny_testbed",
|
9
|
+
:port => ENV.fetch("RABBITMQ_PORT", 5672))
|
10
|
+
c.start
|
11
|
+
c
|
12
|
+
end
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
14
|
+
after :all do
|
15
|
+
connection.close if connection.open?
|
16
|
+
end
|
16
17
|
|
17
18
|
|
18
|
-
|
19
|
-
|
20
|
-
|
19
|
+
context "with payload exceeding 128 Kb (max frame size)" do
|
20
|
+
it "successfully frames the message" do
|
21
|
+
ch = connection.create_channel
|
21
22
|
|
22
|
-
|
23
|
-
|
23
|
+
q = ch.queue("", :exclusive => true)
|
24
|
+
x = ch.default_exchange
|
24
25
|
|
25
|
-
|
26
|
-
|
26
|
+
as = ("a" * (1024 * 1024 * 4 + 28237777))
|
27
|
+
x.publish(as, :routing_key => q.name, :persistent => true)
|
27
28
|
|
28
|
-
|
29
|
-
|
29
|
+
sleep(1)
|
30
|
+
q.message_count.should == 1
|
30
31
|
|
31
|
-
|
32
|
-
|
32
|
+
_, _, payload = q.pop
|
33
|
+
payload.bytesize.should == as.bytesize
|
33
34
|
|
34
|
-
|
35
|
+
ch.close
|
36
|
+
end
|
35
37
|
end
|
36
|
-
end
|
37
38
|
|
38
39
|
|
39
40
|
|
40
|
-
|
41
|
-
|
42
|
-
|
41
|
+
context "with empty message body" do
|
42
|
+
it "successfully publishes the message" do
|
43
|
+
ch = connection.create_channel
|
43
44
|
|
44
|
-
|
45
|
-
|
45
|
+
q = ch.queue("", :exclusive => true)
|
46
|
+
x = ch.default_exchange
|
46
47
|
|
47
|
-
|
48
|
+
x.publish("", :routing_key => q.name, :persistent => false, :mandatory => true)
|
48
49
|
|
49
|
-
|
50
|
-
|
50
|
+
sleep(0.5)
|
51
|
+
q.message_count.should == 1
|
51
52
|
|
52
|
-
|
53
|
+
envelope, headers, payload = q.pop
|
53
54
|
|
54
|
-
|
55
|
+
payload.should == ""
|
55
56
|
|
56
|
-
|
57
|
-
|
58
|
-
|
57
|
+
headers[:content_type].should == "application/octet-stream"
|
58
|
+
headers[:delivery_mode].should == 1
|
59
|
+
headers[:priority].should == 0
|
59
60
|
|
60
|
-
|
61
|
+
ch.close
|
62
|
+
end
|
61
63
|
end
|
62
64
|
end
|
63
65
|
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Bunny::Queue, "#subscribe" do
|
4
|
+
let(:publisher_connection) do
|
5
|
+
c = Bunny.new(:user => "bunny_gem", :password => "bunny_password", :vhost => "bunny_testbed")
|
6
|
+
c.start
|
7
|
+
c
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:consumer_connection) do
|
11
|
+
c = Bunny.new(:user => "bunny_reader", :password => "reader_password", :vhost => "bunny_testbed")
|
12
|
+
c.start
|
13
|
+
c
|
14
|
+
end
|
15
|
+
|
16
|
+
after :all do
|
17
|
+
publisher_connection.close if publisher_connection.open?
|
18
|
+
consumer_connection.close if consumer_connection.open?
|
19
|
+
end
|
20
|
+
|
21
|
+
context "with automatic acknowledgement mode" do
|
22
|
+
let(:queue_name) { "bunny.basic_consume#{rand}" }
|
23
|
+
|
24
|
+
it "registers the consumer" do
|
25
|
+
delivered_keys = []
|
26
|
+
delivered_data = []
|
27
|
+
|
28
|
+
ch = publisher_connection.create_channel
|
29
|
+
# declare the queue because the read-only user won't be able to issue
|
30
|
+
# queue.declare
|
31
|
+
q = ch.queue(queue_name, :auto_delete => true, :durable => false)
|
32
|
+
|
33
|
+
t = Thread.new do
|
34
|
+
# give the main thread a bit of time to declare the queue
|
35
|
+
sleep 0.5
|
36
|
+
ch = consumer_connection.create_channel
|
37
|
+
# this connection is read only, use passive declare to only get
|
38
|
+
# a reference to the queue
|
39
|
+
q = ch.queue(queue_name, :auto_delete => true, :durable => false, :passive => true)
|
40
|
+
q.subscribe(:exclusive => false) do |delivery_info, properties, payload|
|
41
|
+
delivered_keys << delivery_info.routing_key
|
42
|
+
delivered_data << payload
|
43
|
+
end
|
44
|
+
end
|
45
|
+
t.abort_on_exception = true
|
46
|
+
sleep 0.5
|
47
|
+
|
48
|
+
x = ch.default_exchange
|
49
|
+
x.publish("hello", :routing_key => queue_name)
|
50
|
+
|
51
|
+
sleep 0.7
|
52
|
+
delivered_keys.should include(queue_name)
|
53
|
+
delivered_data.should include("hello")
|
54
|
+
|
55
|
+
ch.queue(queue_name, :auto_delete => true, :durable => false).message_count.should == 0
|
56
|
+
|
57
|
+
ch.close
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end # describe
|
data/spec/unit/transport_spec.rb
CHANGED
@@ -1,15 +1,18 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
# mystically fails on Rubinius on CI. MK.
|
4
|
+
if RUBY_ENGINE != "rbx"
|
5
|
+
describe Bunny::Transport, ".reachable?" do
|
6
|
+
it "returns true for google.com, 80" do
|
7
|
+
Bunny::Transport.reacheable?("google.com", 80, 1).should be_true
|
8
|
+
end
|
7
9
|
|
8
|
-
|
9
|
-
|
10
|
-
|
10
|
+
it "returns true for google.com, 8088" do
|
11
|
+
Bunny::Transport.reacheable?("google.com", 8088, 1).should be_false
|
12
|
+
end
|
11
13
|
|
12
|
-
|
13
|
-
|
14
|
+
it "returns false for google1237982792837.com, 8277" do
|
15
|
+
Bunny::Transport.reacheable?("google1237982792837.com", 8277, 1).should be_false
|
16
|
+
end
|
14
17
|
end
|
15
18
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bunny
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.0
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Duncan
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2013-
|
15
|
+
date: 2013-07-12 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: amq-protocol
|
@@ -68,6 +68,8 @@ files:
|
|
68
68
|
- examples/connection/channel_level_exception.rb
|
69
69
|
- examples/connection/disabled_automatic_recovery.rb
|
70
70
|
- examples/connection/heartbeat.rb
|
71
|
+
- examples/connection/manually_reconnecting_consumer.rb
|
72
|
+
- examples/connection/manually_reconnecting_publisher.rb
|
71
73
|
- examples/connection/unknown_host.rb
|
72
74
|
- examples/guides/exchanges/direct_exchange_routing.rb
|
73
75
|
- examples/guides/exchanges/fanout_exchange_routing.rb
|
@@ -143,6 +145,7 @@ files:
|
|
143
145
|
- spec/higher_level_api/integration/exchange_delete_spec.rb
|
144
146
|
- spec/higher_level_api/integration/exchange_unbind_spec.rb
|
145
147
|
- spec/higher_level_api/integration/heartbeat_spec.rb
|
148
|
+
- spec/higher_level_api/integration/merry_go_round_spec.rb
|
146
149
|
- spec/higher_level_api/integration/message_properties_access_spec.rb
|
147
150
|
- spec/higher_level_api/integration/predeclared_exchanges_spec.rb
|
148
151
|
- spec/higher_level_api/integration/publisher_confirms_spec.rb
|
@@ -152,6 +155,7 @@ files:
|
|
152
155
|
- spec/higher_level_api/integration/queue_delete_spec.rb
|
153
156
|
- spec/higher_level_api/integration/queue_purge_spec.rb
|
154
157
|
- spec/higher_level_api/integration/queue_unbind_spec.rb
|
158
|
+
- spec/higher_level_api/integration/read_only_consumer_spec.rb
|
155
159
|
- spec/higher_level_api/integration/sender_selected_distribution_spec.rb
|
156
160
|
- spec/higher_level_api/integration/tls_connection_spec.rb
|
157
161
|
- spec/higher_level_api/integration/tx_commit_spec.rb
|
@@ -193,9 +197,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
193
197
|
version: '0'
|
194
198
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
195
199
|
requirements:
|
196
|
-
- - '
|
200
|
+
- - '>='
|
197
201
|
- !ruby/object:Gem::Version
|
198
|
-
version:
|
202
|
+
version: '0'
|
199
203
|
requirements: []
|
200
204
|
rubyforge_project:
|
201
205
|
rubygems_version: 2.0.3
|
@@ -228,6 +232,7 @@ test_files:
|
|
228
232
|
- spec/higher_level_api/integration/exchange_delete_spec.rb
|
229
233
|
- spec/higher_level_api/integration/exchange_unbind_spec.rb
|
230
234
|
- spec/higher_level_api/integration/heartbeat_spec.rb
|
235
|
+
- spec/higher_level_api/integration/merry_go_round_spec.rb
|
231
236
|
- spec/higher_level_api/integration/message_properties_access_spec.rb
|
232
237
|
- spec/higher_level_api/integration/predeclared_exchanges_spec.rb
|
233
238
|
- spec/higher_level_api/integration/publisher_confirms_spec.rb
|
@@ -237,6 +242,7 @@ test_files:
|
|
237
242
|
- spec/higher_level_api/integration/queue_delete_spec.rb
|
238
243
|
- spec/higher_level_api/integration/queue_purge_spec.rb
|
239
244
|
- spec/higher_level_api/integration/queue_unbind_spec.rb
|
245
|
+
- spec/higher_level_api/integration/read_only_consumer_spec.rb
|
240
246
|
- spec/higher_level_api/integration/sender_selected_distribution_spec.rb
|
241
247
|
- spec/higher_level_api/integration/tls_connection_spec.rb
|
242
248
|
- spec/higher_level_api/integration/tx_commit_spec.rb
|