bunny 0.9.0.pre12 → 0.9.0.pre13
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/ChangeLog.md +32 -0
- data/examples/guides/queues/one_off_consumer.rb +23 -0
- data/lib/bunny/channel.rb +51 -13
- data/lib/bunny/consumer.rb +4 -0
- data/lib/bunny/delivery_info.rb +8 -2
- data/lib/bunny/exceptions.rb +1 -1
- data/lib/bunny/exchange.rb +11 -0
- data/lib/bunny/session.rb +1 -1
- data/lib/bunny/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b138bcc7caf170e8104ab84dcf9dc4ae89387efa
|
4
|
+
data.tar.gz: e379d87d1c0fa62e5c84908f530d8160328873cf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f850913f5f76996a6f333ff5bc2a945506c99b1463999b2f912a1602d7f96ff293285d26beb48ddf99cba314f69c6910d38e23858408c11d39a18dc821583dff
|
7
|
+
data.tar.gz: a12db3df3ad28867e4af5268e5a8f623884649cddc2259ceef6fadbd716099fc7928712857ababe86ad4e336406ea0d3672f8b8d0dd2dab4547475feccf5a41b
|
data/ChangeLog.md
CHANGED
@@ -1,3 +1,35 @@
|
|
1
|
+
## Changes between Bunny 0.9.0.pre12 and 0.9.0.pre13
|
2
|
+
|
3
|
+
### Channels Without Consumers Now Tear Down Consumer Pools
|
4
|
+
|
5
|
+
Channels without consumers left (when all consumers were cancelled)
|
6
|
+
will now tear down their consumer work thread pools, thus making
|
7
|
+
`HotBunnies::Queue#subscribe(:block => true)` calls unblock.
|
8
|
+
|
9
|
+
This is typically the desired behavior.
|
10
|
+
|
11
|
+
### Consumer and Channel Available In Delivery Handlers
|
12
|
+
|
13
|
+
Delivery handlers registered via `Bunny::Queue#subscribe` now will have
|
14
|
+
access to the consumer and channel they are associated with via the
|
15
|
+
`delivery_info` argument:
|
16
|
+
|
17
|
+
``` ruby
|
18
|
+
q.subscribe do |delivery_info, properties, payload|
|
19
|
+
delivery_info.consumer # => the consumer this delivery is for
|
20
|
+
delivery_info.consumer # => the channel this delivery is on
|
21
|
+
end
|
22
|
+
```
|
23
|
+
|
24
|
+
This allows using `Bunny::Queue#subscribe` for one-off consumers
|
25
|
+
much easier, including when used with the `:block` option.
|
26
|
+
|
27
|
+
### Bunny::Exchange#wait_for_confirms
|
28
|
+
|
29
|
+
`Bunny::Exchange#wait_for_confirms` is a convenience method on `Bunny::Exchange` that
|
30
|
+
delegates to the method with the same name on exchange's channel.
|
31
|
+
|
32
|
+
|
1
33
|
## Changes between Bunny 0.9.0.pre11 and 0.9.0.pre12
|
2
34
|
|
3
35
|
### Ruby 1.8 Compatibility Regression Fix
|
@@ -0,0 +1,23 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
require "rubygems"
|
5
|
+
require "bunny"
|
6
|
+
|
7
|
+
conn = Bunny.new
|
8
|
+
conn.start
|
9
|
+
|
10
|
+
ch = conn.create_channel
|
11
|
+
q = ch.queue("bunny.examples.hello_world", :auto_delete => true)
|
12
|
+
|
13
|
+
q.publish("Hello!", :routing_key => q.name)
|
14
|
+
|
15
|
+
# demonstrates a blocking consumer that needs to cancel itself
|
16
|
+
# in the message handler
|
17
|
+
q.subscribe(:block => true) do |delivery_info, properties, payload|
|
18
|
+
puts "Received #{payload}, cancelling"
|
19
|
+
delivery_info.consumer.cancel
|
20
|
+
end
|
21
|
+
|
22
|
+
sleep 1.0
|
23
|
+
conn.close
|
data/lib/bunny/channel.rb
CHANGED
@@ -18,7 +18,7 @@ else
|
|
18
18
|
end
|
19
19
|
|
20
20
|
module Bunny
|
21
|
-
# ##
|
21
|
+
# ## Channels in RabbitMQ
|
22
22
|
#
|
23
23
|
# To quote {http://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0.9.1 specification}:
|
24
24
|
#
|
@@ -41,7 +41,7 @@ module Bunny
|
|
41
41
|
#
|
42
42
|
# ch = conn.create_channel
|
43
43
|
#
|
44
|
-
# This will automatically allocate channel id.
|
44
|
+
# This will automatically allocate a channel id.
|
45
45
|
#
|
46
46
|
# @example Instantiating
|
47
47
|
#
|
@@ -806,9 +806,18 @@ module Bunny
|
|
806
806
|
false,
|
807
807
|
arguments))
|
808
808
|
|
809
|
-
|
810
|
-
|
809
|
+
begin
|
810
|
+
Bunny::Timer.timeout(read_write_timeout, ClientTimeout) do
|
811
|
+
@last_basic_consume_ok = wait_on_continuations
|
812
|
+
end
|
813
|
+
rescue Exception => e
|
814
|
+
# if basic.consume-ok never arrives, unregister the proactively
|
815
|
+
# registered consumer. MK.
|
816
|
+
unregister_consumer(@last_basic_consume_ok.consumer_tag)
|
817
|
+
|
818
|
+
raise e
|
811
819
|
end
|
820
|
+
|
812
821
|
# covers server-generated consumer tags
|
813
822
|
add_consumer(queue_name, @last_basic_consume_ok.consumer_tag, no_ack, exclusive, arguments, &block)
|
814
823
|
|
@@ -827,6 +836,12 @@ module Bunny
|
|
827
836
|
raise_if_no_longer_open!
|
828
837
|
maybe_start_consumer_work_pool!
|
829
838
|
|
839
|
+
# helps avoid race condition between basic.consume-ok and basic.deliver if there are messages
|
840
|
+
# in the queue already. MK.
|
841
|
+
if consumer.consumer_tag && consumer.consumer_tag.strip != AMQ::Protocol::EMPTY_STRING
|
842
|
+
register_consumer(consumer.consumer_tag, consumer)
|
843
|
+
end
|
844
|
+
|
830
845
|
@connection.send_frame(AMQ::Protocol::Basic::Consume.encode(@id,
|
831
846
|
consumer.queue_name,
|
832
847
|
consumer.consumer_tag,
|
@@ -836,15 +851,18 @@ module Bunny
|
|
836
851
|
false,
|
837
852
|
consumer.arguments))
|
838
853
|
|
839
|
-
|
840
|
-
|
841
|
-
|
842
|
-
|
843
|
-
|
854
|
+
begin
|
855
|
+
Bunny::Timer.timeout(read_write_timeout, ClientTimeout) do
|
856
|
+
@last_basic_consume_ok = wait_on_continuations
|
857
|
+
end
|
858
|
+
rescue Exception => e
|
859
|
+
# if basic.consume-ok never arrives, unregister the proactively
|
860
|
+
# registered consumer. MK.
|
861
|
+
unregister_consumer(@last_basic_consume_ok.consumer_tag)
|
844
862
|
|
845
|
-
|
846
|
-
@last_basic_consume_ok = wait_on_continuations
|
863
|
+
raise e
|
847
864
|
end
|
865
|
+
|
848
866
|
# covers server-generated consumer tags
|
849
867
|
register_consumer(@last_basic_consume_ok.consumer_tag, consumer)
|
850
868
|
|
@@ -868,9 +886,17 @@ module Bunny
|
|
868
886
|
@last_basic_cancel_ok = wait_on_continuations
|
869
887
|
end
|
870
888
|
|
889
|
+
maybe_kill_consumer_work_pool! unless any_consumers?
|
890
|
+
|
871
891
|
@last_basic_cancel_ok
|
872
892
|
end
|
873
893
|
|
894
|
+
# @return [Boolean] true if there are consumers on this channel
|
895
|
+
# @api public
|
896
|
+
def any_consumers?
|
897
|
+
@consumer_mutex.synchronize { @consumers.any? }
|
898
|
+
end
|
899
|
+
|
874
900
|
# @endgroup
|
875
901
|
|
876
902
|
|
@@ -1417,6 +1443,11 @@ module Bunny
|
|
1417
1443
|
# @endgroup
|
1418
1444
|
|
1419
1445
|
|
1446
|
+
def to_s
|
1447
|
+
"#<#{self.class.name}:#{object_id} @id=#{self.number} @connection=#{@connection.to_s}>"
|
1448
|
+
end
|
1449
|
+
|
1450
|
+
|
1420
1451
|
#
|
1421
1452
|
# Implementation
|
1422
1453
|
#
|
@@ -1428,6 +1459,13 @@ module Bunny
|
|
1428
1459
|
end
|
1429
1460
|
end
|
1430
1461
|
|
1462
|
+
# @private
|
1463
|
+
def unregister_consumer(consumer_tag)
|
1464
|
+
@consumer_mutex.synchronize do
|
1465
|
+
@consumers.delete(consumer_tag)
|
1466
|
+
end
|
1467
|
+
end
|
1468
|
+
|
1431
1469
|
# @private
|
1432
1470
|
def add_consumer(queue, consumer_tag, no_ack, exclusive, arguments, &block)
|
1433
1471
|
@consumer_mutex.synchronize do
|
@@ -1475,7 +1513,7 @@ module Bunny
|
|
1475
1513
|
@consumers.delete(method.consumer_tag)
|
1476
1514
|
when AMQ::Protocol::Basic::CancelOk then
|
1477
1515
|
@continuations.push(method)
|
1478
|
-
|
1516
|
+
unregister_consumer(method.consumer_tag)
|
1479
1517
|
when AMQ::Protocol::Tx::SelectOk, AMQ::Protocol::Tx::CommitOk, AMQ::Protocol::Tx::RollbackOk then
|
1480
1518
|
@continuations.push(method)
|
1481
1519
|
when AMQ::Protocol::Tx::SelectOk then
|
@@ -1525,7 +1563,7 @@ module Bunny
|
|
1525
1563
|
consumer = @consumers[basic_deliver.consumer_tag]
|
1526
1564
|
if consumer
|
1527
1565
|
@work_pool.submit do
|
1528
|
-
consumer.call(DeliveryInfo.new(basic_deliver), MessageProperties.new(properties), content)
|
1566
|
+
consumer.call(DeliveryInfo.new(basic_deliver, consumer, self), MessageProperties.new(properties), content)
|
1529
1567
|
end
|
1530
1568
|
else
|
1531
1569
|
@logger.warn "No consumer for tag #{basic_deliver.consumer_tag} on channel #{@id}!"
|
data/lib/bunny/consumer.rb
CHANGED
@@ -83,6 +83,10 @@ module Bunny
|
|
83
83
|
"#<#{self.class.name}:#{object_id} @channel_id=#{@channel.number} @queue=#{self.queue_name}> @consumer_tag=#{@consumer_tag} @exclusive=#{@exclusive} @no_ack=#{@no_ack}>"
|
84
84
|
end
|
85
85
|
|
86
|
+
def to_s
|
87
|
+
"#<#{self.class.name}:#{object_id} @channel_id=#{@channel.number} @queue=#{self.queue_name}> @consumer_tag=#{@consumer_tag}>"
|
88
|
+
end
|
89
|
+
|
86
90
|
#
|
87
91
|
# Recovery
|
88
92
|
#
|
data/lib/bunny/delivery_info.rb
CHANGED
@@ -14,15 +14,21 @@ module Bunny
|
|
14
14
|
# API
|
15
15
|
#
|
16
16
|
|
17
|
-
|
17
|
+
attr_reader :consumer, :channel
|
18
|
+
|
19
|
+
def initialize(basic_deliver, consumer, channel)
|
18
20
|
@basic_deliver = basic_deliver
|
19
21
|
@hash = {
|
20
22
|
:consumer_tag => basic_deliver.consumer_tag,
|
21
23
|
:delivery_tag => basic_deliver.delivery_tag,
|
22
24
|
:redelivered => basic_deliver.redelivered,
|
23
25
|
:exchange => basic_deliver.exchange,
|
24
|
-
:routing_key => basic_deliver.routing_key
|
26
|
+
:routing_key => basic_deliver.routing_key,
|
27
|
+
:consumer => consumer,
|
28
|
+
:channel => channel
|
25
29
|
}
|
30
|
+
@consumer = consumer
|
31
|
+
@channel = channel
|
26
32
|
end
|
27
33
|
|
28
34
|
def each(*args, &block)
|
data/lib/bunny/exceptions.rb
CHANGED
@@ -70,7 +70,7 @@ module Bunny
|
|
70
70
|
@username = username
|
71
71
|
@vhost = vhost
|
72
72
|
|
73
|
-
super("
|
73
|
+
super("RabbitMQ closed TCP connection before authentication succeeded: this usually means authentication failure due to misconfiguration or that RabbitMQ version does not support AMQP 0.9.1. Please check your configuration. Username: #{username}, vhost: #{vhost}, password length: #{password_length}")
|
74
74
|
end # initialize(settings)
|
75
75
|
end # PossibleAuthenticationFailureError
|
76
76
|
|
data/lib/bunny/exchange.rb
CHANGED
@@ -196,12 +196,23 @@ module Bunny
|
|
196
196
|
|
197
197
|
# Defines a block that will handle returned messages
|
198
198
|
# @see http://rubybunny.info/articles/exchanges.html
|
199
|
+
# @api public
|
199
200
|
def on_return(&block)
|
200
201
|
@on_return = block
|
201
202
|
|
202
203
|
self
|
203
204
|
end
|
204
205
|
|
206
|
+
# Waits until all outstanding publisher confirms on the channel
|
207
|
+
# arrive.
|
208
|
+
#
|
209
|
+
# This is a convenience method that delegates to {Bunny::Channel#wait_for_confirms}
|
210
|
+
#
|
211
|
+
# @api public
|
212
|
+
def wait_for_confirms
|
213
|
+
@channel.wait_for_confirms
|
214
|
+
end
|
215
|
+
|
205
216
|
# @private
|
206
217
|
def recover_from_network_failure
|
207
218
|
# puts "Recovering exchange #{@name} from network failure"
|
data/lib/bunny/session.rb
CHANGED
data/lib/bunny/version.rb
CHANGED
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.pre13
|
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-05-
|
15
|
+
date: 2013-05-30 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: amq-protocol
|
@@ -86,6 +86,7 @@ files:
|
|
86
86
|
- examples/guides/getting_started/blabbr.rb
|
87
87
|
- examples/guides/getting_started/hello_world.rb
|
88
88
|
- examples/guides/getting_started/weathr.rb
|
89
|
+
- examples/guides/queues/one_off_consumer.rb
|
89
90
|
- examples/guides/queues/redeliveries.rb
|
90
91
|
- lib/bunny.rb
|
91
92
|
- lib/bunny/authentication/credentials_encoder.rb
|