amqp 0.9.10 → 1.0.0.pre1
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.
- data/.travis.yml +0 -3
- data/CHANGELOG +4 -0
- data/Gemfile +1 -0
- data/README.md +72 -81
- data/amqp.gemspec +14 -5
- data/docs/08Migration.textile +0 -4
- data/docs/AMQP091ModelExplained.textile +0 -5
- data/docs/Bindings.textile +0 -4
- data/docs/Clustering.textile +0 -4
- data/docs/ConnectingToTheBroker.textile +1 -5
- data/docs/ConnectionEncryptionWithTLS.textile +0 -4
- data/docs/DocumentationGuidesIndex.textile +0 -4
- data/docs/Durability.textile +0 -4
- data/docs/ErrorHandling.textile +40 -106
- data/docs/Exchanges.textile +0 -4
- data/docs/GettingStarted.textile +6 -10
- data/docs/PatternsAndUseCases.textile +1 -4
- data/docs/Queues.textile +0 -4
- data/docs/RabbitMQVersions.textile +0 -4
- data/docs/RunningTests.textile +0 -4
- data/docs/TestingWithEventedSpec.textile +0 -4
- data/docs/Troubleshooting.textile +0 -4
- data/docs/VendorSpecificExtensions.textile +0 -4
- data/examples/error_handling/hello_world_producer.rb +1 -1
- data/examples/issues/issue_121.rb +23 -0
- data/examples/patterns/request_reply/client.rb +2 -1
- data/examples/patterns/request_reply/server.rb +1 -0
- data/examples/publishing/returned_messages.rb +1 -1
- data/lib/amqp.rb +0 -7
- data/lib/amqp/channel.rb +15 -33
- data/lib/amqp/client.rb +2 -2
- data/lib/amqp/compatibility/ruby187_patchlevel_check.rb +4 -4
- data/lib/amqp/connection.rb +0 -1
- data/lib/amqp/consumer.rb +2 -2
- data/lib/amqp/exceptions.rb +1 -10
- data/lib/amqp/exchange.rb +5 -5
- data/lib/amqp/queue.rb +23 -47
- data/lib/amqp/session.rb +4 -4
- data/lib/amqp/version.rb +1 -1
- data/spec/integration/basic_get_spec.rb +24 -80
- data/spec/integration/basic_return_spec.rb +3 -3
- data/spec/integration/channel_level_exception_with_multiple_channels_spec.rb +1 -0
- data/spec/integration/exchange_declaration_spec.rb +102 -71
- data/spec/integration/extensions/rabbitmq/publisher_confirmations_spec.rb +17 -1
- data/spec/integration/fanout_exchange_routing_spec.rb +1 -1
- data/spec/integration/immediate_messages_spec.rb +59 -0
- data/spec/integration/multiple_consumers_per_queue_spec.rb +101 -39
- data/spec/integration/queue_redeclaration_with_incompatible_attributes_spec.rb +12 -25
- data/spec/integration/regressions/concurrent_publishing_on_the_same_channel_spec.rb +1 -1
- data/spec/integration/reply_queue_communication_spec.rb +2 -1
- data/spec/integration/store_and_forward_spec.rb +9 -6
- data/spec/integration/topic_subscription_spec.rb +4 -5
- data/spec/spec_helper.rb +2 -8
- data/spec/unit/amqp/connection_spec.rb +1 -3
- metadata +112 -116
- data/examples/deprecated/default_thread_local_channel_instance.rb +0 -34
- data/examples/legacy/ack.rb +0 -70
- data/examples/legacy/callbacks.rb +0 -45
- data/examples/legacy/clock.rb +0 -74
- data/examples/legacy/hashtable.rb +0 -60
- data/examples/legacy/logger.rb +0 -92
- data/examples/legacy/multiclock.rb +0 -56
- data/examples/legacy/pingpong.rb +0 -51
- data/examples/legacy/primes-simple.rb +0 -29
- data/examples/legacy/primes.rb +0 -74
- data/examples/legacy/stocks.rb +0 -59
- data/lib/amqp/deprecated/fork.rb +0 -17
- data/lib/amqp/deprecated/logger.rb +0 -100
- data/lib/amqp/deprecated/mq.rb +0 -22
- data/lib/amqp/deprecated/rpc.rb +0 -169
- data/lib/amqp/ext/em.rb +0 -3
- data/lib/amqp/ext/emfork.rb +0 -72
- data/lib/amqp/logger.rb +0 -19
- data/lib/amqp/rpc.rb +0 -20
- data/lib/mq.rb +0 -35
- data/lib/mq/logger.rb +0 -4
- data/lib/mq/rpc.rb +0 -4
- data/spec/integration/remove_individual_binding_spec.rb +0 -51
@@ -2,10 +2,6 @@
|
|
2
2
|
|
3
3
|
h1. Ruby amqp gem and RabbitMQ versions compatibility
|
4
4
|
|
5
|
-
h2. This Documentation Has Moved to rubyamqp.info
|
6
|
-
|
7
|
-
amqp gem documentation guides are now hosted on "rubyamqp.info":http://rubyamqp.info.
|
8
|
-
|
9
5
|
h2. About this guide
|
10
6
|
|
11
7
|
This guide covers compatibility of the "Ruby amqp gem":http://github.com/ruby-amqp/amqp with various versions of "RabbitMQ":http://rabbitmq.com messaging broker.
|
data/docs/RunningTests.textile
CHANGED
@@ -2,10 +2,6 @@
|
|
2
2
|
|
3
3
|
h1. Testing AMQP applications
|
4
4
|
|
5
|
-
h2. This Documentation Has Moved to rubyamqp.info
|
6
|
-
|
7
|
-
amqp gem documentation guides are now hosted on "rubyamqp.info":http://rubyamqp.info.
|
8
|
-
|
9
5
|
h2. About this guide
|
10
6
|
|
11
7
|
This guide covers unit testing of amqp-based applications, primarily using "evented-spec":http://github.com/ruby-amqp/evented-spec.
|
@@ -39,7 +39,7 @@ AMQP.start(:host => ENV.fetch("BROKER_HOST", "localhost")) do |connection, open_
|
|
39
39
|
EventMachine.add_periodic_timer(0.8) do
|
40
40
|
puts "Publishing via amq.fanout..."
|
41
41
|
# messages must be routable & there must be at least one consumer.
|
42
|
-
exchange.publish("Routed via amq.fanout", :mandatory => true)
|
42
|
+
exchange.publish("Routed via amq.fanout", :immediate => true, :mandatory => true)
|
43
43
|
end
|
44
44
|
|
45
45
|
|
@@ -0,0 +1,23 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
require "bundler"
|
5
|
+
Bundler.setup
|
6
|
+
|
7
|
+
$:.unshift(File.expand_path("../../../lib", __FILE__))
|
8
|
+
|
9
|
+
|
10
|
+
|
11
|
+
require 'amqp'
|
12
|
+
require 'amqp/extensions/rabbitmq'
|
13
|
+
AMQP.start(:user => 'guest',:pass => 'guest',:vhost => '/') do |connection|
|
14
|
+
channel = AMQP::Channel.new(connection)
|
15
|
+
channel.queue("shuki_q",{:nowait => true,:passive=>false, :auto_delete=>false, :arguments=>{"x-expires"=>5600000}}) do |queue|
|
16
|
+
queue.bind('raw.shuki',:routing_key => 'ShukiesTukies')
|
17
|
+
puts "before subscribe"
|
18
|
+
queue.subscribe(:ack => true) do |header, payload|
|
19
|
+
puts "inside subscribe"
|
20
|
+
p header.class
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -19,7 +19,8 @@ EventMachine.run do
|
|
19
19
|
channel.default_exchange.publish("get.time",
|
20
20
|
:routing_key => "amqpgem.examples.services.time",
|
21
21
|
:message_id => Kernel.rand(10101010).to_s,
|
22
|
-
:reply_to => replies_queue.name
|
22
|
+
:reply_to => replies_queue.name,
|
23
|
+
:immediate => true)
|
23
24
|
end
|
24
25
|
|
25
26
|
|
data/lib/amqp.rb
CHANGED
data/lib/amqp/channel.rb
CHANGED
@@ -7,7 +7,7 @@ require "amqp/queue"
|
|
7
7
|
module AMQP
|
8
8
|
# h2. What are AMQP channels
|
9
9
|
#
|
10
|
-
# To quote {http://
|
10
|
+
# To quote {http://bit.ly/hw2ELX AMQP 0.9.1 specification}:
|
11
11
|
#
|
12
12
|
# AMQP is a multi-channelled protocol. Channels provide a way to multiplex
|
13
13
|
# a heavyweight TCP/IP connection into several light weight connections.
|
@@ -140,7 +140,7 @@ module AMQP
|
|
140
140
|
# AMQP gem supports several RabbitMQ extensions taht extend Channel functionality.
|
141
141
|
# Learn more in {file:docs/VendorSpecificExtensions.textile}
|
142
142
|
#
|
143
|
-
# @see http://
|
143
|
+
# @see http://bit.ly/hw2ELX AMQP 0.9.1 specification (Section 2.2.5)
|
144
144
|
class Channel < AMQ::Client::Channel
|
145
145
|
|
146
146
|
#
|
@@ -263,9 +263,6 @@ module AMQP
|
|
263
263
|
def auto_recover
|
264
264
|
return unless auto_recovering?
|
265
265
|
|
266
|
-
@channel_is_open_deferrable.fail
|
267
|
-
@channel_is_open_deferrable = AMQ::Client::EventMachineClient::Deferrable.new
|
268
|
-
|
269
266
|
self.open do
|
270
267
|
@channel_is_open_deferrable.succeed
|
271
268
|
|
@@ -289,9 +286,6 @@ module AMQP
|
|
289
286
|
@id = self.class.next_channel_id
|
290
287
|
self.class.release_channel_id(old_id)
|
291
288
|
|
292
|
-
@channel_is_open_deferrable.fail
|
293
|
-
@channel_is_open_deferrable = AMQ::Client::EventMachineClient::Deferrable.new
|
294
|
-
|
295
289
|
self.open do
|
296
290
|
@channel_is_open_deferrable.succeed
|
297
291
|
|
@@ -379,7 +373,7 @@ module AMQP
|
|
379
373
|
# @see Channel#default_exchange
|
380
374
|
# @see Exchange
|
381
375
|
# @see Exchange#initialize
|
382
|
-
# @see http://
|
376
|
+
# @see http://bit.ly/hw2ELX AMQP 0.9.1 specification (Section 3.1.3.1)
|
383
377
|
#
|
384
378
|
# @return [Exchange]
|
385
379
|
# @api public
|
@@ -432,7 +426,7 @@ module AMQP
|
|
432
426
|
#
|
433
427
|
#
|
434
428
|
# @see Exchange
|
435
|
-
# @see http://
|
429
|
+
# @see http://bit.ly/hw2ELX AMQP 0.9.1 specification (Section 2.1.2.4)
|
436
430
|
#
|
437
431
|
# @return [Exchange]
|
438
432
|
# @api public
|
@@ -487,7 +481,7 @@ module AMQP
|
|
487
481
|
# @see Exchange
|
488
482
|
# @see Exchange#initialize
|
489
483
|
# @see Channel#default_exchange
|
490
|
-
# @see http://
|
484
|
+
# @see http://bit.ly/hw2ELX AMQP 0.9.1 specification (Section 3.1.3.2)
|
491
485
|
#
|
492
486
|
# @return [Exchange]
|
493
487
|
# @api public
|
@@ -603,7 +597,7 @@ module AMQP
|
|
603
597
|
# @see Exchange
|
604
598
|
# @see Exchange#initialize
|
605
599
|
# @see http://www.rabbitmq.com/faq.html#Binding-and-Routing RabbitMQ FAQ on routing & wildcards
|
606
|
-
# @see http://
|
600
|
+
# @see http://bit.ly/hw2ELX AMQP 0.9.1 specification (Section 3.1.3.3)
|
607
601
|
#
|
608
602
|
# @return [Exchange]
|
609
603
|
# @api public
|
@@ -709,7 +703,7 @@ module AMQP
|
|
709
703
|
# @see Exchange
|
710
704
|
# @see Exchange#initialize
|
711
705
|
# @see Channel#default_exchange
|
712
|
-
# @see http://
|
706
|
+
# @see http://bit.ly/hw2ELX AMQP 0.9.1 specification (Section 3.1.3.3)
|
713
707
|
#
|
714
708
|
# @return [Exchange]
|
715
709
|
# @api public
|
@@ -810,7 +804,7 @@ module AMQP
|
|
810
804
|
#
|
811
805
|
# @see Queue
|
812
806
|
# @see Queue#initialize
|
813
|
-
# @see http://
|
807
|
+
# @see http://bit.ly/hw2ELX AMQP 0.9.1 specification (Section 2.1.4)
|
814
808
|
#
|
815
809
|
# @return [Queue]
|
816
810
|
# @api public
|
@@ -935,27 +929,16 @@ module AMQP
|
|
935
929
|
#
|
936
930
|
# @api public
|
937
931
|
def once_open(&block)
|
938
|
-
@channel_is_open_deferrable.callback
|
939
|
-
# guards against cases when deferred operations
|
940
|
-
# don't complete before the channel is closed
|
941
|
-
block.call if open?
|
942
|
-
end
|
932
|
+
@channel_is_open_deferrable.callback(&block)
|
943
933
|
end # once_open(&block)
|
944
934
|
alias once_opened once_open
|
945
935
|
|
946
|
-
# @return [Boolean]
|
947
|
-
# @api public
|
948
|
-
def closing?
|
949
|
-
self.status == :closing
|
950
|
-
end
|
951
|
-
|
952
936
|
# Closes AMQP channel.
|
953
937
|
#
|
954
938
|
# @api public
|
955
939
|
def close(reply_code = 200, reply_text = DEFAULT_REPLY_TEXT, class_id = 0, method_id = 0, &block)
|
956
|
-
self.status = :closing
|
957
940
|
r = super(reply_code, reply_text, class_id, method_id, &block)
|
958
|
-
|
941
|
+
|
959
942
|
r
|
960
943
|
end
|
961
944
|
|
@@ -974,7 +957,7 @@ module AMQP
|
|
974
957
|
#
|
975
958
|
# @param [Boolean] Desired flow state.
|
976
959
|
#
|
977
|
-
# @see http://
|
960
|
+
# @see http://bit.ly/htCzCX AMQP 0.9.1 protocol documentation (Section 1.5.2.3.)
|
978
961
|
# @api public
|
979
962
|
def flow(active = false, &block)
|
980
963
|
super(active, &block)
|
@@ -1015,7 +998,7 @@ module AMQP
|
|
1015
998
|
# @api public
|
1016
999
|
# @see #reject
|
1017
1000
|
# @see #recover
|
1018
|
-
# @see http://
|
1001
|
+
# @see http://bit.ly/htCzCX AMQP 0.9.1 protocol documentation (Section 1.8.3.13.)
|
1019
1002
|
def acknowledge(delivery_tag, multiple = false)
|
1020
1003
|
super(delivery_tag, multiple)
|
1021
1004
|
end # acknowledge(delivery_tag, multiple = false)
|
@@ -1025,7 +1008,7 @@ module AMQP
|
|
1025
1008
|
# @api public
|
1026
1009
|
# @see #acknowledge
|
1027
1010
|
# @see #recover
|
1028
|
-
# @see http://
|
1011
|
+
# @see http://bit.ly/htCzCX AMQP 0.9.1 protocol documentation (Section 1.8.3.14.)
|
1029
1012
|
def reject(delivery_tag, requeue = true)
|
1030
1013
|
super(delivery_tag, requeue)
|
1031
1014
|
end # reject(delivery_tag, requeue = true)
|
@@ -1036,7 +1019,7 @@ module AMQP
|
|
1036
1019
|
# @return [Channel] self
|
1037
1020
|
#
|
1038
1021
|
# @note RabbitMQ as of 2.3.1 does not support basic.recover with requeue = false.
|
1039
|
-
# @see http://
|
1022
|
+
# @see http://bit.ly/htCzCX AMQP 0.9.1 protocol documentation (Section 1.8.3.16.)
|
1040
1023
|
# @see #acknowledge
|
1041
1024
|
# @api public
|
1042
1025
|
def recover(requeue = true, &block)
|
@@ -1137,9 +1120,8 @@ module AMQP
|
|
1137
1120
|
super(method)
|
1138
1121
|
|
1139
1122
|
self.class.error(method.reply_text)
|
1140
|
-
self.class.release_channel_id(@id)
|
1141
1123
|
end
|
1142
|
-
|
1124
|
+
|
1143
1125
|
# Overrides AMQ::Client::Channel version to also release the channel id
|
1144
1126
|
#
|
1145
1127
|
# @private
|
data/lib/amqp/client.rb
CHANGED
@@ -22,7 +22,7 @@ module AMQP
|
|
22
22
|
# @see AMQP.connect
|
23
23
|
# @api plugin
|
24
24
|
#
|
25
|
-
# @see http://
|
25
|
+
# @see http://bit.ly/ks8MXK Connecting to The Broker documentation guide
|
26
26
|
def self.connect(connection_string_or_options = {}, options = {}, &block)
|
27
27
|
opts = case connection_string_or_options
|
28
28
|
when String then
|
@@ -82,7 +82,7 @@ module AMQP
|
|
82
82
|
#
|
83
83
|
# @raise [ArgumentError] When connection URI schema is not amqp or amqps, or the path contains multiple segments
|
84
84
|
#
|
85
|
-
# @see http://
|
85
|
+
# @see http://bit.ly/ks8MXK Connecting to The Broker documentation guide
|
86
86
|
# @api public
|
87
87
|
def self.parse_connection_uri(connection_string)
|
88
88
|
AMQ::Client::Settings.parse_amqp_url(connection_string)
|
@@ -7,15 +7,15 @@ if RUBY_VERSION =~ /^1.8.7/
|
|
7
7
|
# looks like PATCHLEVEL was added after 1.8.7-p249 release :( MK.
|
8
8
|
if (conf["PATCHLEVEL"] && conf["PATCHLEVEL"] == "249") || (conf["libdir"] =~ /1.8.7-p249/)
|
9
9
|
raise <<-MESSAGE
|
10
|
-
IMPORTANT: amqp gem 0.8.0+ does not support Ruby 1.8.7-p249 (this exact patch level. p174 and
|
10
|
+
IMPORTANT: amqp gem 0.8.0+ does not support Ruby 1.8.7-p249 (this exact patch level. p174, p334 and later patch levels are supported!)
|
11
11
|
because of a nasty Ruby bug (http://bit.ly/iONBmH). Refer to http://groups.google.com/group/ruby-amqp/browse_thread/thread/37d6dcc1aea1c102
|
12
12
|
for more information, especially if you want to verify whether a particular Ruby patch level or version or build suffers from
|
13
13
|
this issue.
|
14
14
|
|
15
|
-
To reiterate: 1.8.7-p174 and
|
15
|
+
To reiterate: 1.8.7-p174, p334 and later patch levels are supported, see http://travis-ci.org/ruby-amqp/amqp. The fix was committed to MRI in December 2009. It's
|
16
16
|
a good idea to upgrade, although downgrading to p174 is an option, too.
|
17
17
|
|
18
|
-
To learn more (including the 0.8.x migration guide) at http://bit.ly/
|
18
|
+
To learn more (including the 0.8.x migration guide) at http://bit.ly/rubyamqp and https://github.com/ruby-amqp.
|
19
19
|
MESSAGE
|
20
20
|
end
|
21
|
-
end
|
21
|
+
end
|
data/lib/amqp/connection.rb
CHANGED
@@ -192,7 +192,6 @@ module AMQP
|
|
192
192
|
# @option connection_options_or_string [String] :username ("guest") Username to use. Also can be specified as :user.
|
193
193
|
# @option connection_options_or_string [String] :password ("guest") Password to use. Also can be specified as :pass.
|
194
194
|
# @option connection_options_or_string [Hash] :ssl TLS (SSL) parameters to use.
|
195
|
-
# @option connection_options_or_string [Fixnum] :heartbeat (0) Connection heartbeat, in seconds. 0 means no heartbeat. Can also be configured server-side starting with RabbitMQ 3.0.
|
196
195
|
# @option connection_options_or_string [#call] :on_tcp_connection_failure A callable object that will be run if connection to server fails
|
197
196
|
# @option connection_options_or_string [#call] :on_possible_authentication_failure A callable object that will be run if authentication fails (see Authentication failure section)
|
198
197
|
#
|
data/lib/amqp/consumer.rb
CHANGED
@@ -139,7 +139,7 @@ module AMQP
|
|
139
139
|
# @return [Consumer] self
|
140
140
|
#
|
141
141
|
# @api public
|
142
|
-
# @see http://
|
142
|
+
# @see http://bit.ly/htCzCX AMQP 0.9.1 protocol documentation (Section 1.8.3.13.)
|
143
143
|
def acknowledge(delivery_tag)
|
144
144
|
super(delivery_tag)
|
145
145
|
end # acknowledge(delivery_tag)
|
@@ -148,7 +148,7 @@ module AMQP
|
|
148
148
|
# @return [Consumer] self
|
149
149
|
#
|
150
150
|
# @api public
|
151
|
-
# @see http://
|
151
|
+
# @see http://bit.ly/htCzCX AMQP 0.9.1 protocol documentation (Section 1.8.3.14.)
|
152
152
|
def reject(delivery_tag, requeue = true)
|
153
153
|
super(delivery_tag, requeue)
|
154
154
|
end # reject(delivery_tag, requeue = true)
|
data/lib/amqp/exceptions.rb
CHANGED
@@ -43,17 +43,8 @@ module AMQP
|
|
43
43
|
def initialize(settings)
|
44
44
|
@settings = settings
|
45
45
|
|
46
|
-
super("AMQP broker closed TCP connection before authentication succeeded: this usually means authentication failure due to misconfiguration. Settings are #{
|
46
|
+
super("AMQP broker closed TCP connection before authentication succeeded: this usually means authentication failure due to misconfiguration. Settings are #{settings.inspect}")
|
47
47
|
end # initialize(settings)
|
48
|
-
|
49
|
-
def filtered_settings
|
50
|
-
filtered_settings = settings.dup
|
51
|
-
[:pass, :password].each do |sensitve_setting|
|
52
|
-
filtered_settings[sensitve_setting] &&= '[filtered]'
|
53
|
-
end
|
54
|
-
|
55
|
-
filtered_settings
|
56
|
-
end
|
57
48
|
end # PossibleAuthenticationFailureError
|
58
49
|
|
59
50
|
|
data/lib/amqp/exchange.rb
CHANGED
@@ -134,9 +134,9 @@ module AMQP
|
|
134
134
|
# @see Channel#topic
|
135
135
|
# @see Channel#headers
|
136
136
|
# @see Queue
|
137
|
-
# @see http://
|
138
|
-
# @see http://
|
139
|
-
# @see http://
|
137
|
+
# @see http://bit.ly/hw2ELX AMQP 0.9.1 specification (Section 2.1.1)
|
138
|
+
# @see http://bit.ly/hw2ELX AMQP 0.9.1 specification (Section 2.1.5)
|
139
|
+
# @see http://bit.ly/hw2ELX AMQP 0.9.1 specification (Section 3.1.3)
|
140
140
|
class Exchange < AMQ::Client::Exchange
|
141
141
|
|
142
142
|
#
|
@@ -162,7 +162,7 @@ module AMQP
|
|
162
162
|
# AMQP::Exchange.default(channel).publish("make clean", routing_key => "tasks")
|
163
163
|
#
|
164
164
|
# @see Exchange
|
165
|
-
# @see http://
|
165
|
+
# @see http://bit.ly/hw2ELX AMQP 0.9.1 specification (Section 2.1.2.4)
|
166
166
|
# @note Do not confuse default exchange with amq.direct: amq.direct is a pre-defined direct
|
167
167
|
# exchange that doesn't have any special routing semantics.
|
168
168
|
# @return [Exchange] An instance that corresponds to the default exchange (of type direct).
|
@@ -292,7 +292,7 @@ module AMQP
|
|
292
292
|
# @see Channel#topic
|
293
293
|
# @see Channel#headers
|
294
294
|
# @see Queue
|
295
|
-
# @see http://
|
295
|
+
# @see http://bit.ly/hw2ELX AMQP 0.9.1 specification (Section 3.1.3)
|
296
296
|
#
|
297
297
|
# @return [Exchange]
|
298
298
|
# @api public
|
data/lib/amqp/queue.rb
CHANGED
@@ -116,7 +116,7 @@ module AMQP
|
|
116
116
|
# persistence.
|
117
117
|
#
|
118
118
|
#
|
119
|
-
# @see http://
|
119
|
+
# @see http://bit.ly/hw2ELX AMQP 0.9.1 specification (Section 2.1.1)
|
120
120
|
# @see AMQP::Exchange
|
121
121
|
class Queue < AMQ::Client::Queue
|
122
122
|
|
@@ -221,11 +221,7 @@ module AMQP
|
|
221
221
|
#
|
222
222
|
# @api public
|
223
223
|
def once_declared(&block)
|
224
|
-
@declaration_deferrable.callback
|
225
|
-
# guards against cases when deferred operations
|
226
|
-
# don't complete before the channel is closed
|
227
|
-
block.call if @channel.open?
|
228
|
-
end
|
224
|
+
@declaration_deferrable.callback(&block)
|
229
225
|
end # once_declared(&block)
|
230
226
|
|
231
227
|
|
@@ -285,8 +281,14 @@ module AMQP
|
|
285
281
|
# @api public
|
286
282
|
# @see Queue#unbind
|
287
283
|
def bind(exchange, opts = {}, &block)
|
288
|
-
|
289
|
-
|
284
|
+
if self.server_named?
|
285
|
+
@channel.once_open do
|
286
|
+
@declaration_deferrable.callback do
|
287
|
+
super(exchange, (opts[:key] || opts[:routing_key] || AMQ::Protocol::EMPTY_STRING), (opts[:nowait] || block.nil?), opts[:arguments], &block)
|
288
|
+
end
|
289
|
+
end
|
290
|
+
else
|
291
|
+
@channel.once_open do
|
290
292
|
super(exchange, (opts[:key] || opts[:routing_key] || AMQ::Protocol::EMPTY_STRING), (opts[:nowait] || block.nil?), opts[:arguments], &block)
|
291
293
|
end
|
292
294
|
end
|
@@ -355,9 +357,7 @@ module AMQP
|
|
355
357
|
# @see Queue#bind
|
356
358
|
def unbind(exchange, opts = {}, &block)
|
357
359
|
@channel.once_open do
|
358
|
-
|
359
|
-
super(exchange, (opts[:key] || opts[:routing_key] || AMQ::Protocol::EMPTY_STRING), opts[:arguments], &block)
|
360
|
-
end
|
360
|
+
super(exchange, (opts[:key] || opts[:routing_key] || AMQ::Protocol::EMPTY_STRING), opts[:arguments], &block)
|
361
361
|
end
|
362
362
|
end
|
363
363
|
|
@@ -391,9 +391,7 @@ module AMQP
|
|
391
391
|
# @see Queue#unbind
|
392
392
|
def delete(opts = {}, &block)
|
393
393
|
@channel.once_open do
|
394
|
-
|
395
|
-
super(opts.fetch(:if_unused, false), opts.fetch(:if_empty, false), opts.fetch(:nowait, false), &block)
|
396
|
-
end
|
394
|
+
super(opts.fetch(:if_unused, false), opts.fetch(:if_empty, false), opts.fetch(:nowait, false), &block)
|
397
395
|
end
|
398
396
|
|
399
397
|
# backwards compatibility
|
@@ -418,9 +416,7 @@ module AMQP
|
|
418
416
|
# @see Queue#unbind
|
419
417
|
def purge(opts = {}, &block)
|
420
418
|
@channel.once_open do
|
421
|
-
|
422
|
-
super(opts.fetch(:nowait, false), &block)
|
423
|
-
end
|
419
|
+
super(opts.fetch(:nowait, false), &block)
|
424
420
|
end
|
425
421
|
|
426
422
|
# backwards compatibility
|
@@ -481,17 +477,11 @@ module AMQP
|
|
481
477
|
}
|
482
478
|
|
483
479
|
@channel.once_open do
|
484
|
-
|
485
|
-
|
486
|
-
self.get(!opts.fetch(:ack, false), &shim)
|
487
|
-
end
|
480
|
+
# see AMQ::Client::Queue#get in amq-client
|
481
|
+
self.get(!opts.fetch(:ack, false), &shim)
|
488
482
|
end
|
489
483
|
else
|
490
|
-
@channel.once_open
|
491
|
-
self.once_name_is_available do
|
492
|
-
self.get(!opts.fetch(:ack, false))
|
493
|
-
end
|
494
|
-
end
|
484
|
+
@channel.once_open { self.get(!opts.fetch(:ack, false)) }
|
495
485
|
end
|
496
486
|
end
|
497
487
|
|
@@ -729,9 +719,7 @@ module AMQP
|
|
729
719
|
opts[:nowait] = false if (@on_confirm_subscribe = opts[:confirm])
|
730
720
|
|
731
721
|
@channel.once_open do
|
732
|
-
self.
|
733
|
-
# guards against a pathological case race condition when a channel
|
734
|
-
# is opened and closed before delayed operations are completed.
|
722
|
+
self.once_declared do
|
735
723
|
self.consume(!opts[:ack], opts[:exclusive], (opts[:nowait] || block.nil?), opts[:no_local], nil, &opts[:confirm])
|
736
724
|
|
737
725
|
self.on_delivery(&block)
|
@@ -797,7 +785,7 @@ module AMQP
|
|
797
785
|
# @api public
|
798
786
|
def unsubscribe(opts = {}, &block)
|
799
787
|
@channel.once_open do
|
800
|
-
self.
|
788
|
+
self.once_declared do
|
801
789
|
if @default_consumer
|
802
790
|
@default_consumer.cancel(opts.fetch(:nowait, true), &block); @default_consumer = nil
|
803
791
|
end
|
@@ -824,14 +812,12 @@ module AMQP
|
|
824
812
|
shim = Proc.new { |q, declare_ok| block.call(declare_ok.message_count, declare_ok.consumer_count) }
|
825
813
|
|
826
814
|
@channel.once_open do
|
827
|
-
self.
|
828
|
-
|
829
|
-
|
830
|
-
@connection.send_frame(AMQ::Protocol::Queue::Declare.encode(@channel.id, @name, true, @opts[:durable], @opts[:exclusive], @opts[:auto_delete], false, @opts[:arguments]))
|
815
|
+
# we do not use self.declare here to avoid caching of @passive since that will cause unexpected side-effects during automatic
|
816
|
+
# recovery process. MK.
|
817
|
+
@connection.send_frame(AMQ::Protocol::Queue::Declare.encode(@channel.id, @name, true, @opts[:durable], @opts[:exclusive], @opts[:auto_delete], false, @opts[:arguments]))
|
831
818
|
|
832
|
-
|
833
|
-
|
834
|
-
end
|
819
|
+
self.append_callback(:declare, &shim)
|
820
|
+
@channel.queues_awaiting_declare_ok.push(self)
|
835
821
|
end
|
836
822
|
|
837
823
|
self
|
@@ -897,16 +883,6 @@ module AMQP
|
|
897
883
|
{ :queue => name, :nowait => (block.nil? && !name.empty?) }.merge(opts)
|
898
884
|
end
|
899
885
|
|
900
|
-
def once_name_is_available(&block)
|
901
|
-
if server_named?
|
902
|
-
self.once_declared do
|
903
|
-
block.call
|
904
|
-
end
|
905
|
-
else
|
906
|
-
block.call
|
907
|
-
end
|
908
|
-
end
|
909
|
-
|
910
886
|
private
|
911
887
|
|
912
888
|
# Default direct exchange that we use to publish messages directly to this queue.
|