amqp 1.7.0 → 1.8.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/.gitignore +2 -0
- data/.travis.yml +3 -3
- data/ChangeLog.md +13 -2
- data/README.md +6 -2
- data/amqp.gemspec +1 -1
- data/lib/amqp.rb +3 -12
- data/lib/amqp/channel.rb +15 -15
- data/lib/amqp/exchange.rb +5 -5
- data/lib/amqp/queue.rb +12 -12
- data/lib/amqp/session.rb +46 -50
- data/lib/amqp/settings.rb +0 -142
- data/lib/amqp/version.rb +1 -1
- data/spec/integration/queue_redeclaration_with_incompatible_attributes_spec.rb +2 -2
- data/spec/unit/amqp/connection_spec.rb +19 -2
- metadata +18 -20
- data/.ruby-version +0 -1
- data/spec/unit/amqp/client_spec.rb +0 -104
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c7c6beb8c9f54c7d3a51e0abc31dfa3f17cd6c5b
|
4
|
+
data.tar.gz: c89625f4494fc2aebd74ad933cd444bc59530457
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 863eaec5942ad6a567cf7ce5f049b73cba3572af5fbcb20419071e88a8ff8e091b20c2c8ad9590c1326efc0eaca5fa4a5777ce924237f91dfeb875c7dffd8c51
|
7
|
+
data.tar.gz: 459b706baa1524e2493c5ffabc4aefdf0ced0cd1f82e090fe1aed0a672ead1e9cc70c2847ac6f2b2e0d4634cd21faba3aba379ce3c3f54a472e10b8f56da77ae
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
language: ruby
|
2
2
|
bundler_args: --without development
|
3
|
-
before_script: ./bin/ci/before_build
|
3
|
+
before_script: ./bin/ci/before_build
|
4
4
|
script: "bundle exec rake spec:ci"
|
5
5
|
env:
|
6
6
|
- CI=true
|
7
7
|
rvm:
|
8
8
|
- 2.3.3
|
9
|
-
- 2.4.
|
9
|
+
- 2.4.1
|
10
10
|
gemfile:
|
11
11
|
- Gemfile
|
12
12
|
- gemfiles/eventmachine-pre
|
@@ -16,7 +16,7 @@ notifications:
|
|
16
16
|
branches:
|
17
17
|
only:
|
18
18
|
- master
|
19
|
-
- 1.
|
19
|
+
- 1.7.x-stable
|
20
20
|
matrix:
|
21
21
|
allow_failures:
|
22
22
|
- rvm: jruby
|
data/ChangeLog.md
CHANGED
@@ -1,7 +1,18 @@
|
|
1
|
-
## Changes Between 1.6.0 and 1.7.0 (
|
1
|
+
## Changes Between 1.6.0 and 1.7.0 (Feb 2nd, 2017)
|
2
2
|
|
3
|
-
|
3
|
+
### Clear Framesets on Exception
|
4
4
|
|
5
|
+
Unprocessed frames received on a connection are now correctly
|
6
|
+
cleared when an exception occurs.
|
7
|
+
|
8
|
+
Contributed by Michael Lutsiuk.
|
9
|
+
|
10
|
+
GitHub issue: [#218](https://github.com/ruby-amqp/amqp/issues/218)
|
11
|
+
|
12
|
+
|
13
|
+
### amq-protocol Update
|
14
|
+
|
15
|
+
Minimum `amq-protocol` version is now `2.1.0`.
|
5
16
|
|
6
17
|
|
7
18
|
## Changes Between 1.5.0 and 1.6.0 (Apr 4th, 2016)
|
data/README.md
CHANGED
@@ -3,6 +3,9 @@
|
|
3
3
|
[Ruby amqp gem](http://rubyamqp.info) is a feature-rich,
|
4
4
|
EventMachine-based RabbitMQ client with batteries included.
|
5
5
|
|
6
|
+
It's the original RabbitMQ client for Ruby. These days there are very
|
7
|
+
solid alternatives available: [Bunny](http://rubybunny.info) for MRI and [March Hare](http://rubymarchhare.info) for JRuby.
|
8
|
+
|
6
9
|
It implement [AMQP
|
7
10
|
0.9.1](http://www.rabbitmq.com/tutorials/amqp-concepts.html) and
|
8
11
|
support [RabbitMQ extensions to AMQP
|
@@ -134,8 +137,9 @@ to learn more about RabbitMQ protocol principles & concepts.
|
|
134
137
|
|
135
138
|
## Supported Ruby Versions
|
136
139
|
|
137
|
-
amqp gem `1.6.x` series
|
140
|
+
amqp gem `1.6.x` and `1.7.x` series support
|
138
141
|
|
142
|
+
* Ruby 2.4
|
139
143
|
* Ruby 2.3
|
140
144
|
* Ruby 2.2
|
141
145
|
* Ruby 2.1
|
@@ -236,7 +240,7 @@ amqp gem is licensed under the [Ruby License](http://www.ruby-lang.org/en/LICENS
|
|
236
240
|
* The Initial Developer of the Original Code is Aman Gupta.
|
237
241
|
* Copyright (c) 2008 - 2010 [Aman Gupta](http://github.com/tmm1).
|
238
242
|
* Contributions from [Jakub Stastny](http://github.com/botanicus) are Copyright (c) 2011-2012 VMware, Inc.
|
239
|
-
* Copyright (c) 2010 —
|
243
|
+
* Copyright (c) 2010 — 2017 [ruby-amqp](https://github.com/ruby-amqp) group members.
|
240
244
|
|
241
245
|
Currently maintained by [ruby-amqp](https://github.com/ruby-amqp) group members
|
242
246
|
Special thanks to Dmitriy Samovskiy, Ben Hood and Tony Garnock-Jones.
|
data/amqp.gemspec
CHANGED
data/lib/amqp.rb
CHANGED
@@ -229,22 +229,13 @@ module AMQP
|
|
229
229
|
# It takes exactly the same parameters.
|
230
230
|
# @return [AMQP::Session]
|
231
231
|
# @api public
|
232
|
-
def self.connect(connection_options_or_string =
|
233
|
-
|
234
|
-
when String then
|
235
|
-
AMQP::Settings.parse_connection_uri(connection_options_or_string)
|
236
|
-
when Hash then
|
237
|
-
connection_options_or_string
|
238
|
-
else
|
239
|
-
Hash.new
|
240
|
-
end
|
241
|
-
|
242
|
-
AMQP::Session.connect(opts.merge(other_options), &block)
|
232
|
+
def self.connect(connection_options_or_string = ENV['RABBITMQ_URL'], other_options = {}, &block)
|
233
|
+
AMQP::Session.connect(connection_options_or_string, other_options, &block)
|
243
234
|
end
|
244
235
|
|
245
236
|
# @return [Hash] Default AMQP connection settings. This hash may be modified.
|
246
237
|
# @api public
|
247
238
|
def self.settings
|
248
|
-
@settings ||=
|
239
|
+
@settings ||= AMQ::Settings.default.merge(logging: false)
|
249
240
|
end
|
250
241
|
end # AMQP
|
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 {
|
10
|
+
# To quote {https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf 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 that extend Channel functionality.
|
141
141
|
# Learn more in {file:docs/VendorSpecificExtensions.textile}
|
142
142
|
#
|
143
|
-
# @see
|
143
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0.9.1 specification (Section 2.2.5)
|
144
144
|
class Channel
|
145
145
|
|
146
146
|
#
|
@@ -431,7 +431,7 @@ module AMQP
|
|
431
431
|
# @see Channel#default_exchange
|
432
432
|
# @see Exchange
|
433
433
|
# @see Exchange#initialize
|
434
|
-
# @see
|
434
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0.9.1 specification (Section 3.1.3.1)
|
435
435
|
#
|
436
436
|
# @return [Exchange]
|
437
437
|
# @api public
|
@@ -484,7 +484,7 @@ module AMQP
|
|
484
484
|
#
|
485
485
|
#
|
486
486
|
# @see Exchange
|
487
|
-
# @see
|
487
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0.9.1 specification (Section 2.1.2.4)
|
488
488
|
#
|
489
489
|
# @return [Exchange]
|
490
490
|
# @api public
|
@@ -534,7 +534,7 @@ module AMQP
|
|
534
534
|
# @see Exchange
|
535
535
|
# @see Exchange#initialize
|
536
536
|
# @see Channel#default_exchange
|
537
|
-
# @see
|
537
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0.9.1 specification (Section 3.1.3.2)
|
538
538
|
#
|
539
539
|
# @return [Exchange]
|
540
540
|
# @api public
|
@@ -645,7 +645,7 @@ module AMQP
|
|
645
645
|
# @see Exchange
|
646
646
|
# @see Exchange#initialize
|
647
647
|
# @see http://www.rabbitmq.com/faq.html#Binding-and-Routing RabbitMQ FAQ on routing & wildcards
|
648
|
-
# @see
|
648
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0.9.1 specification (Section 3.1.3.3)
|
649
649
|
#
|
650
650
|
# @return [Exchange]
|
651
651
|
# @api public
|
@@ -747,7 +747,7 @@ module AMQP
|
|
747
747
|
# @see Exchange
|
748
748
|
# @see Exchange#initialize
|
749
749
|
# @see Channel#default_exchange
|
750
|
-
# @see
|
750
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0.9.1 specification (Section 3.1.3.3)
|
751
751
|
#
|
752
752
|
# @return [Exchange]
|
753
753
|
# @api public
|
@@ -842,7 +842,7 @@ module AMQP
|
|
842
842
|
#
|
843
843
|
# @see Queue
|
844
844
|
# @see Queue#initialize
|
845
|
-
# @see
|
845
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0.9.1 specification (Section 2.1.4)
|
846
846
|
#
|
847
847
|
# @return [Queue]
|
848
848
|
# @api public
|
@@ -971,7 +971,7 @@ module AMQP
|
|
971
971
|
#
|
972
972
|
# @param [Boolean] Desired flow state.
|
973
973
|
#
|
974
|
-
# @see
|
974
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf AMQP 0.9.1 protocol documentation (Section 1.5.2.3.)
|
975
975
|
# @api public
|
976
976
|
def flow(active = false, &block)
|
977
977
|
@connection.send_frame(AMQ::Protocol::Channel::Flow.encode(@id, active))
|
@@ -1017,7 +1017,7 @@ module AMQP
|
|
1017
1017
|
# @api public
|
1018
1018
|
# @see #reject
|
1019
1019
|
# @see #recover
|
1020
|
-
# @see
|
1020
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf AMQP 0.9.1 protocol documentation (Section 1.8.3.13.)
|
1021
1021
|
def acknowledge(delivery_tag, multiple = false)
|
1022
1022
|
@connection.send_frame(AMQ::Protocol::Basic::Ack.encode(self.id, delivery_tag, multiple))
|
1023
1023
|
|
@@ -1029,7 +1029,7 @@ module AMQP
|
|
1029
1029
|
# @api public
|
1030
1030
|
# @see #acknowledge
|
1031
1031
|
# @see #recover
|
1032
|
-
# @see
|
1032
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf AMQP 0.9.1 protocol documentation (Section 1.8.3.14.)
|
1033
1033
|
def reject(delivery_tag, requeue = true, multi = false)
|
1034
1034
|
if multi
|
1035
1035
|
@connection.send_frame(AMQ::Protocol::Basic::Nack.encode(self.id, delivery_tag, multi, requeue))
|
@@ -1046,7 +1046,7 @@ module AMQP
|
|
1046
1046
|
# @return [Channel] self
|
1047
1047
|
#
|
1048
1048
|
# @note RabbitMQ as of 2.3.1 does not support basic.recover with requeue = false.
|
1049
|
-
# @see
|
1049
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf AMQP 0.9.1 protocol documentation (Section 1.8.3.16.)
|
1050
1050
|
# @see #acknowledge
|
1051
1051
|
# @api public
|
1052
1052
|
def recover(requeue = true, &block)
|
@@ -1118,9 +1118,9 @@ module AMQP
|
|
1118
1118
|
|
1119
1119
|
def confirm_select(nowait = false, &block)
|
1120
1120
|
self.once_open do
|
1121
|
-
|
1122
|
-
|
1123
|
-
|
1121
|
+
if nowait && block
|
1122
|
+
raise ArgumentError, "confirm.select with nowait = true and a callback makes no sense"
|
1123
|
+
end
|
1124
1124
|
|
1125
1125
|
@uses_publisher_confirmations = true
|
1126
1126
|
reset_publisher_index!
|
data/lib/amqp/exchange.rb
CHANGED
@@ -132,9 +132,9 @@ module AMQP
|
|
132
132
|
# @see Channel#topic
|
133
133
|
# @see Channel#headers
|
134
134
|
# @see Queue
|
135
|
-
# @see
|
136
|
-
# @see
|
137
|
-
# @see
|
135
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0.9.1 specification (Section 2.1.1)
|
136
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0.9.1 specification (Section 2.1.5)
|
137
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0.9.1 specification (Section 3.1.3)
|
138
138
|
class Exchange
|
139
139
|
|
140
140
|
|
@@ -170,7 +170,7 @@ module AMQP
|
|
170
170
|
# AMQP::Exchange.default(channel).publish("make clean", routing_key => "tasks")
|
171
171
|
#
|
172
172
|
# @see Exchange
|
173
|
-
# @see
|
173
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0.9.1 specification (Section 2.1.2.4)
|
174
174
|
# @note Do not confuse default exchange with amq.direct: amq.direct is a pre-defined direct
|
175
175
|
# exchange that doesn't have any special routing semantics.
|
176
176
|
# @return [Exchange] An instance that corresponds to the default exchange (of type direct).
|
@@ -303,7 +303,7 @@ module AMQP
|
|
303
303
|
# @see Channel#topic
|
304
304
|
# @see Channel#headers
|
305
305
|
# @see Queue
|
306
|
-
# @see
|
306
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0.9.1 specification (Section 3.1.3)
|
307
307
|
#
|
308
308
|
# @return [Exchange]
|
309
309
|
# @api public
|
data/lib/amqp/queue.rb
CHANGED
@@ -118,7 +118,7 @@ module AMQP
|
|
118
118
|
# persistence.
|
119
119
|
#
|
120
120
|
#
|
121
|
-
# @see
|
121
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0.9.1 specification (Section 2.1.1)
|
122
122
|
# @see AMQP::Exchange
|
123
123
|
class Queue
|
124
124
|
|
@@ -764,7 +764,7 @@ module AMQP
|
|
764
764
|
end
|
765
765
|
|
766
766
|
# @api public
|
767
|
-
# @see
|
767
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf AMQP 0.9.1 protocol reference (Sections 1.8.3.9)
|
768
768
|
def on_delivery(&block)
|
769
769
|
@default_consumer.on_delivery(&block)
|
770
770
|
end # on_delivery(&block)
|
@@ -939,7 +939,7 @@ module AMQP
|
|
939
939
|
# @return [Queue] self
|
940
940
|
#
|
941
941
|
# @api public
|
942
|
-
# @see
|
942
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf AMQP 0.9.1 protocol reference (Section 1.7.2.1.)
|
943
943
|
def queue_declare(passive = false, durable = false, exclusive = false, auto_delete = false, nowait = false, arguments = nil, &block)
|
944
944
|
raise ArgumentError, "declaration with nowait does not make sense for server-named queues! Either specify name other than empty string or use #declare without nowait" if nowait && self.anonymous?
|
945
945
|
|
@@ -996,7 +996,7 @@ module AMQP
|
|
996
996
|
# @return [Queue] self
|
997
997
|
#
|
998
998
|
# @api public
|
999
|
-
# @see
|
999
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf AMQP 0.9.1 protocol reference (Section 1.7.2.9.)
|
1000
1000
|
def queue_delete(if_unused = false, if_empty = false, nowait = false, &block)
|
1001
1001
|
nowait = true unless block
|
1002
1002
|
@connection.send_frame(AMQ::Protocol::Queue::Delete.encode(@channel.id, @name, if_unused, if_empty, nowait))
|
@@ -1019,7 +1019,7 @@ module AMQP
|
|
1019
1019
|
# @return [Queue] self
|
1020
1020
|
#
|
1021
1021
|
# @api public
|
1022
|
-
# @see
|
1022
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf AMQP 0.9.1 protocol reference (Section 1.7.2.3.)
|
1023
1023
|
def queue_bind(exchange, routing_key = AMQ::Protocol::EMPTY_STRING, nowait = false, arguments = nil, &block)
|
1024
1024
|
nowait = true unless block
|
1025
1025
|
exchange_name = if exchange.respond_to?(:name)
|
@@ -1048,7 +1048,7 @@ module AMQP
|
|
1048
1048
|
# @return [Queue] self
|
1049
1049
|
#
|
1050
1050
|
# @api public
|
1051
|
-
# @see
|
1051
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf AMQP 0.9.1 protocol reference (Section 1.7.2.5.)
|
1052
1052
|
def queue_unbind(exchange, routing_key = AMQ::Protocol::EMPTY_STRING, arguments = nil, &block)
|
1053
1053
|
exchange_name = if exchange.respond_to?(:name)
|
1054
1054
|
exchange.name
|
@@ -1079,7 +1079,7 @@ module AMQP
|
|
1079
1079
|
# @return [Queue] self
|
1080
1080
|
#
|
1081
1081
|
# @api public
|
1082
|
-
# @see
|
1082
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf AMQP 0.9.1 protocol reference (Section 1.8.3.3.)
|
1083
1083
|
def basic_consume(no_ack = false, exclusive = false, nowait = false, no_local = false, arguments = nil, &block)
|
1084
1084
|
raise RuntimeError.new("This queue already has default consumer. Please instantiate AMQP::Consumer directly to register additional consumers.") if @default_consumer
|
1085
1085
|
|
@@ -1094,7 +1094,7 @@ module AMQP
|
|
1094
1094
|
# @return [Queue] self
|
1095
1095
|
#
|
1096
1096
|
# @api public
|
1097
|
-
# @see
|
1097
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf AMQP 0.9.1 protocol reference (Section 1.8.3.5.)
|
1098
1098
|
def cancel(nowait = false, &block)
|
1099
1099
|
raise "There is no default consumer for this queue. This usually means that you are trying to unsubscribe a queue that never was subscribed for messages in the first place." if @default_consumer.nil?
|
1100
1100
|
|
@@ -1119,7 +1119,7 @@ module AMQP
|
|
1119
1119
|
# @return [Queue] self
|
1120
1120
|
#
|
1121
1121
|
# @api public
|
1122
|
-
# @see
|
1122
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf AMQP 0.9.1 protocol reference (Section 1.8.3.10.)
|
1123
1123
|
def get(no_ack = false, &block)
|
1124
1124
|
@connection.send_frame(AMQ::Protocol::Basic::Get.encode(@channel.id, @name, no_ack))
|
1125
1125
|
|
@@ -1140,7 +1140,7 @@ module AMQP
|
|
1140
1140
|
# @return [Queue] self
|
1141
1141
|
#
|
1142
1142
|
# @api public
|
1143
|
-
# @see
|
1143
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf AMQP 0.9.1 protocol reference (Section 1.7.2.7.)
|
1144
1144
|
def queue_purge(nowait = false, &block)
|
1145
1145
|
nowait = true unless block
|
1146
1146
|
@connection.send_frame(AMQ::Protocol::Queue::Purge.encode(@channel.id, @name, nowait))
|
@@ -1164,7 +1164,7 @@ module AMQP
|
|
1164
1164
|
# @return [Queue] self
|
1165
1165
|
#
|
1166
1166
|
# @api public
|
1167
|
-
# @see
|
1167
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf AMQP 0.9.1 protocol reference (Section 1.8.3.13.)
|
1168
1168
|
def acknowledge(delivery_tag)
|
1169
1169
|
@channel.acknowledge(delivery_tag)
|
1170
1170
|
|
@@ -1175,7 +1175,7 @@ module AMQP
|
|
1175
1175
|
# @return [Queue] self
|
1176
1176
|
#
|
1177
1177
|
# @api public
|
1178
|
-
# @see
|
1178
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf AMQP 0.9.1 protocol reference (Section 1.8.3.14.)
|
1179
1179
|
def reject(delivery_tag, requeue = true)
|
1180
1180
|
@channel.reject(delivery_tag, requeue)
|
1181
1181
|
|
data/lib/amqp/session.rb
CHANGED
@@ -7,6 +7,7 @@ require "amqp/broker"
|
|
7
7
|
|
8
8
|
require "amqp/channel"
|
9
9
|
require "amqp/channel_id_allocator"
|
10
|
+
require "amq/settings"
|
10
11
|
|
11
12
|
module AMQP
|
12
13
|
# AMQP session represents connection to the broker. Session objects let you define callbacks for
|
@@ -62,37 +63,22 @@ module AMQP
|
|
62
63
|
|
63
64
|
# The locale defines the language in which the server will send reply texts.
|
64
65
|
#
|
65
|
-
# @see
|
66
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf AMQP 0.9.1 protocol reference (Section 1.4.2.2)
|
66
67
|
attr_accessor :locale
|
67
68
|
|
68
69
|
# Client capabilities
|
69
70
|
#
|
70
|
-
# @see
|
71
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf AMQP 0.9.1 protocol reference (Section 1.4.2.2.1)
|
71
72
|
attr_accessor :client_properties
|
72
73
|
|
73
|
-
# Server properties
|
74
|
-
#
|
75
|
-
# @see http://bit.ly/amqp091reference AMQP 0.9.1 protocol reference (Section 1.4.2.1.3)
|
76
|
-
attr_reader :server_properties
|
77
|
-
|
78
|
-
# Server capabilities
|
79
|
-
#
|
80
|
-
# @see http://bit.ly/amqp091reference AMQP 0.9.1 protocol reference (Section 1.4.2.1.3)
|
81
|
-
attr_reader :server_capabilities
|
82
|
-
|
83
|
-
# Locales server supports
|
84
|
-
#
|
85
|
-
# @see http://bit.ly/amqp091reference AMQP 0.9.1 protocol reference (Section 1.4.2.1.3)
|
86
|
-
attr_reader :server_locales
|
87
|
-
|
88
74
|
# Authentication mechanism used.
|
89
75
|
#
|
90
|
-
# @see
|
76
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf AMQP 0.9.1 protocol reference (Section 1.4.2.2)
|
91
77
|
attr_reader :mechanism
|
92
78
|
|
93
79
|
# Authentication mechanisms broker supports.
|
94
80
|
#
|
95
|
-
# @see
|
81
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf AMQP 0.9.1 protocol reference (Section 1.4.2.2)
|
96
82
|
attr_reader :server_authentication_mechanisms
|
97
83
|
|
98
84
|
# Channels within this connection.
|
@@ -104,14 +90,15 @@ module AMQP
|
|
104
90
|
# Usable channel numbers are in the range 1..channel_max.
|
105
91
|
# Zero indicates no specified limit.
|
106
92
|
#
|
107
|
-
# @see
|
93
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf AMQP 0.9.1 protocol reference (Sections 1.4.2.5.1 and 1.4.2.6.1)
|
108
94
|
attr_accessor :channel_max
|
109
95
|
|
110
96
|
# Maximum frame size that the server permits this connection to use.
|
111
97
|
#
|
112
|
-
# @see
|
98
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf AMQP 0.9.1 protocol reference (Sections 1.4.2.5.2 and 1.4.2.6.2)
|
113
99
|
attr_accessor :frame_max
|
114
100
|
|
101
|
+
attr_accessor :connection_timeout
|
115
102
|
|
116
103
|
attr_reader :known_hosts
|
117
104
|
|
@@ -119,7 +106,7 @@ module AMQP
|
|
119
106
|
class << self
|
120
107
|
# Settings
|
121
108
|
def settings
|
122
|
-
@settings ||=
|
109
|
+
@settings ||= AMQ::Settings.default
|
123
110
|
end
|
124
111
|
|
125
112
|
def logger
|
@@ -156,6 +143,9 @@ module AMQP
|
|
156
143
|
def initialize(*args, &block)
|
157
144
|
super(*args)
|
158
145
|
|
146
|
+
connection_options_or_string = args.first
|
147
|
+
other_options = args[1] || {}
|
148
|
+
|
159
149
|
self.logger = self.class.logger
|
160
150
|
|
161
151
|
# channel => collected frames. MK.
|
@@ -170,9 +160,7 @@ module AMQP
|
|
170
160
|
@tcp_connection_failed = false
|
171
161
|
@intentionally_closing_connection = false
|
172
162
|
|
173
|
-
|
174
|
-
# make it easier to use *args. MK.
|
175
|
-
@settings = Settings.configure(args.first)
|
163
|
+
@settings = AMQ::Settings.configure(connection_options_or_string).merge(other_options)
|
176
164
|
|
177
165
|
@on_tcp_connection_failure = Proc.new { |settings|
|
178
166
|
closed!
|
@@ -186,16 +174,17 @@ module AMQP
|
|
186
174
|
@on_possible_authentication_failure = @settings[:on_possible_authentication_failure] || Proc.new { |settings|
|
187
175
|
raise self.class.authentication_failure_exception_class.new(settings)
|
188
176
|
}
|
189
|
-
|
190
|
-
@mechanism = @settings.fetch(:auth_mechanism, "PLAIN")
|
177
|
+
@mechanism = normalize_auth_mechanism(@settings.fetch(:auth_mechanism, "PLAIN"))
|
191
178
|
@locale = @settings.fetch(:locale, "en_GB")
|
192
179
|
@client_properties = Settings.client_properties.merge(@settings.fetch(:client_properties, Hash.new))
|
193
180
|
|
194
181
|
@auto_recovery = (!!@settings[:auto_recovery])
|
195
182
|
|
183
|
+
@connection_timeout = (@settings[:timeout] || @settings[:connection_timeout] || 3).to_f
|
184
|
+
|
196
185
|
self.reset
|
197
|
-
self.set_pending_connect_timeout(
|
198
|
-
end # initialize
|
186
|
+
self.set_pending_connect_timeout(@connection_timeout) unless defined?(JRUBY_VERSION)
|
187
|
+
end # initialize
|
199
188
|
|
200
189
|
# @return [Boolean] true if this AMQP connection is currently open
|
201
190
|
# @api plugin
|
@@ -231,7 +220,7 @@ module AMQP
|
|
231
220
|
|
232
221
|
|
233
222
|
# Properly close connection with AMQ broker, as described in
|
234
|
-
# section 2.2.4 of the {
|
223
|
+
# section 2.2.4 of the {https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0.9.1 specification}.
|
235
224
|
#
|
236
225
|
# @api plugin
|
237
226
|
# @see #close_connection
|
@@ -263,19 +252,19 @@ module AMQP
|
|
263
252
|
# Server properties (product information, platform, et cetera)
|
264
253
|
#
|
265
254
|
# @return [Hash]
|
266
|
-
# @see
|
255
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf AMQP 0.9.1 protocol documentation (Section 1.4.2.1.3)
|
267
256
|
attr_reader :server_properties
|
268
257
|
|
269
258
|
# Server capabilities (usually used to detect AMQP 0.9.1 extensions like basic.nack, publisher
|
270
259
|
# confirms and so on)
|
271
260
|
#
|
272
261
|
# @return [Hash]
|
273
|
-
# @see
|
262
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf AMQP 0.9.1 protocol documentation (Section 1.4.2.1.3)
|
274
263
|
attr_reader :server_capabilities
|
275
264
|
|
276
265
|
# Locales server supports
|
277
266
|
#
|
278
|
-
# @see
|
267
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf AMQP 0.9.1 protocol documentation (Section 1.4.2.1.3)
|
279
268
|
attr_reader :server_locales
|
280
269
|
|
281
270
|
# @return [AMQP::Broker] Broker this connection is established with
|
@@ -451,8 +440,9 @@ module AMQP
|
|
451
440
|
# @option settings [Fixnum] :frame_max (131072) Maximum frame size to use. If broker cannot support frames this large, broker's maximum value will be used instead.
|
452
441
|
#
|
453
442
|
# @param [Hash] settings
|
454
|
-
def self.connect(settings = {}, &block)
|
455
|
-
|
443
|
+
# def self.connect(settings = {}, &block)
|
444
|
+
def self.connect(connection_string_or_opts = ENV['RABBITMQ_URL'], other_options = {}, &block)
|
445
|
+
@settings = AMQ::Settings.configure(connection_string_or_opts).merge(other_options)
|
456
446
|
|
457
447
|
instance = EventMachine.connect(@settings[:host], @settings[:port], self, @settings)
|
458
448
|
instance.register_connection_callback(&block)
|
@@ -485,14 +475,7 @@ module AMQP
|
|
485
475
|
# @see #reconnect
|
486
476
|
# @api public
|
487
477
|
def reconnect_to(connection_string_or_options, period = 5)
|
488
|
-
settings =
|
489
|
-
when String then
|
490
|
-
AMQP.parse_connection_uri(connection_string_or_options)
|
491
|
-
when Hash then
|
492
|
-
connection_string_or_options
|
493
|
-
else
|
494
|
-
Hash.new
|
495
|
-
end
|
478
|
+
settings = AMQ::Settings.configure(connection_string_or_opts)
|
496
479
|
|
497
480
|
if !@reconnecting
|
498
481
|
@reconnecting = true
|
@@ -763,7 +746,7 @@ module AMQP
|
|
763
746
|
# Zero means the server does not want a heartbeat.
|
764
747
|
#
|
765
748
|
# @return [Fixnum] Heartbeat interval this client uses, in seconds.
|
766
|
-
# @see
|
749
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf AMQP 0.9.1 protocol reference (Section 1.4.2.6)
|
767
750
|
def heartbeat_interval
|
768
751
|
@heartbeat_interval
|
769
752
|
end # heartbeat_interval
|
@@ -894,7 +877,7 @@ module AMQP
|
|
894
877
|
# Sends connection.open to the server.
|
895
878
|
#
|
896
879
|
# @api plugin
|
897
|
-
# @see
|
880
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf AMQP 0.9.1 protocol reference (Section 1.4.2.7)
|
898
881
|
def open(vhost = "/")
|
899
882
|
self.send_frame(AMQ::Protocol::Connection::Open.encode(vhost))
|
900
883
|
end
|
@@ -995,7 +978,7 @@ module AMQP
|
|
995
978
|
# Handles connection.start.
|
996
979
|
#
|
997
980
|
# @api plugin
|
998
|
-
# @see
|
981
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf AMQP 0.9.1 protocol reference (Section 1.4.2.1.)
|
999
982
|
def handle_start(connection_start)
|
1000
983
|
@server_properties = connection_start.server_properties
|
1001
984
|
@server_capabilities = @server_properties["capabilities"]
|
@@ -1018,7 +1001,7 @@ module AMQP
|
|
1018
1001
|
# Handles Connection.Tune-Ok.
|
1019
1002
|
#
|
1020
1003
|
# @api plugin
|
1021
|
-
# @see
|
1004
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf AMQP 0.9.1 protocol reference (Section 1.4.2.6)
|
1022
1005
|
def handle_tune(connection_tune)
|
1023
1006
|
@channel_max = connection_tune.channel_max.freeze
|
1024
1007
|
@frame_max = connection_tune.frame_max.freeze
|
@@ -1035,7 +1018,7 @@ module AMQP
|
|
1035
1018
|
# Handles Connection.Open-Ok.
|
1036
1019
|
#
|
1037
1020
|
# @api plugin
|
1038
|
-
# @see
|
1021
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf AMQP 0.9.1 protocol reference (Section 1.4.2.8.)
|
1039
1022
|
def handle_open_ok(open_ok)
|
1040
1023
|
@known_hosts = open_ok.known_hosts.dup.freeze
|
1041
1024
|
|
@@ -1047,7 +1030,7 @@ module AMQP
|
|
1047
1030
|
# Handles connection.close. When broker detects a connection level exception, this method is called.
|
1048
1031
|
#
|
1049
1032
|
# @api plugin
|
1050
|
-
# @see
|
1033
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf AMQP 0.9.1 protocol reference (Section 1.5.2.9)
|
1051
1034
|
def handle_close(conn_close)
|
1052
1035
|
closed!
|
1053
1036
|
# getting connection.close during connection negotiation means authentication
|
@@ -1063,7 +1046,7 @@ module AMQP
|
|
1063
1046
|
# Handles Connection.Close-Ok.
|
1064
1047
|
#
|
1065
1048
|
# @api plugin
|
1066
|
-
# @see
|
1049
|
+
# @see https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf AMQP 0.9.1 protocol reference (Section 1.4.2.10)
|
1067
1050
|
def handle_close_ok(close_ok)
|
1068
1051
|
closed!
|
1069
1052
|
self.disconnection_successful
|
@@ -1185,5 +1168,18 @@ module AMQP
|
|
1185
1168
|
start_tls
|
1186
1169
|
end
|
1187
1170
|
end # upgrade_to_tls_if_necessary
|
1171
|
+
|
1172
|
+
private
|
1173
|
+
|
1174
|
+
def normalize_auth_mechanism(value)
|
1175
|
+
case value
|
1176
|
+
when [] then
|
1177
|
+
"PLAIN"
|
1178
|
+
when nil then
|
1179
|
+
"PLAIN"
|
1180
|
+
else
|
1181
|
+
value
|
1182
|
+
end
|
1183
|
+
end
|
1188
1184
|
end # Session
|
1189
1185
|
end # AMQP
|
data/lib/amqp/settings.rb
CHANGED
@@ -1,46 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
require "amq/protocol/client"
|
4
|
-
require "uri"
|
5
|
-
|
6
3
|
module AMQP
|
7
|
-
# @see AMQP::Settings.configure
|
8
4
|
module Settings
|
9
|
-
# @private
|
10
|
-
AMQP_PORTS = {"amqp" => 5672, "amqps" => 5671}.freeze
|
11
|
-
|
12
|
-
# @private
|
13
|
-
AMQPS = "amqps".freeze
|
14
|
-
|
15
|
-
# Default connection settings used by AMQ clients
|
16
|
-
#
|
17
|
-
# @see AMQP::Settings.configure
|
18
|
-
def self.default
|
19
|
-
@default ||= {
|
20
|
-
# server
|
21
|
-
:host => "127.0.0.1",
|
22
|
-
:port => AMQ::Protocol::DEFAULT_PORT,
|
23
|
-
|
24
|
-
# login
|
25
|
-
:user => "guest",
|
26
|
-
:pass => "guest",
|
27
|
-
:auth_mechanism => "PLAIN",
|
28
|
-
:vhost => "/",
|
29
|
-
|
30
|
-
# connection timeout
|
31
|
-
:timeout => nil,
|
32
|
-
|
33
|
-
# logging
|
34
|
-
:logging => false,
|
35
|
-
|
36
|
-
# ssl
|
37
|
-
:ssl => false,
|
38
|
-
|
39
|
-
:frame_max => 131072,
|
40
|
-
:heartbeat => 0
|
41
|
-
}
|
42
|
-
end
|
43
|
-
|
44
5
|
CLIENT_PROPERTIES = {
|
45
6
|
:platform => ::RUBY_DESCRIPTION,
|
46
7
|
:product => "amqp gem",
|
@@ -59,108 +20,5 @@ module AMQP
|
|
59
20
|
def self.client_properties
|
60
21
|
@client_properties ||= CLIENT_PROPERTIES
|
61
22
|
end
|
62
|
-
|
63
|
-
|
64
|
-
# Merges given configuration parameters with defaults and returns
|
65
|
-
# the result.
|
66
|
-
#
|
67
|
-
# @param [Hash] Configuration parameters to use.
|
68
|
-
#
|
69
|
-
# @option settings [String] :host ("127.0.0.1") Hostname AMQ broker runs on.
|
70
|
-
# @option settings [String] :port (5672) Port AMQ broker listens on.
|
71
|
-
# @option settings [String] :vhost ("/") Virtual host to use.
|
72
|
-
# @option settings [String] :user ("guest") Username to use for authentication.
|
73
|
-
# @option settings [String] :pass ("guest") Password to use for authentication.
|
74
|
-
# @option settings [String] :ssl (false) Should be use TLS (SSL) for connection?
|
75
|
-
# @option settings [String] :timeout (nil) Connection timeout.
|
76
|
-
# @option settings [String] :logging (false) Turns logging on or off.
|
77
|
-
# @option settings [String] :broker (nil) Broker name (use if you intend to use broker-specific features).
|
78
|
-
# @option settings [Fixnum] :frame_max (131072) Maximum frame size to use. If broker cannot support frames this large, broker's maximum value will be used instead.
|
79
|
-
#
|
80
|
-
# @return [Hash] Merged configuration parameters.
|
81
|
-
def self.configure(settings = nil)
|
82
|
-
case settings
|
83
|
-
when Hash then
|
84
|
-
settings = Hash[settings.map {|k, v| [k.to_sym, v] }] # symbolize keys
|
85
|
-
if username = settings.delete(:username)
|
86
|
-
settings[:user] ||= username
|
87
|
-
end
|
88
|
-
|
89
|
-
if password = settings.delete(:password)
|
90
|
-
settings[:pass] ||= password
|
91
|
-
end
|
92
|
-
|
93
|
-
|
94
|
-
self.default.merge(settings)
|
95
|
-
when String then
|
96
|
-
settings = self.parse_amqp_url(settings)
|
97
|
-
self.default.merge(settings)
|
98
|
-
when NilClass then
|
99
|
-
self.default
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
# Parses AMQP connection URI and returns its components as a hash.
|
104
|
-
#
|
105
|
-
# h2. vhost naming schemes
|
106
|
-
#
|
107
|
-
# It is convenient to be able to specify the AMQP connection
|
108
|
-
# parameters as a URI string, and various "amqp" URI schemes
|
109
|
-
# exist. Unfortunately, there is no standard for these URIs, so
|
110
|
-
# while the schemes share the basic idea, they differ in some
|
111
|
-
# details. This implementation aims to encourage URIs that work
|
112
|
-
# as widely as possible.
|
113
|
-
#
|
114
|
-
# The URI scheme should be "amqp", or "amqps" if SSL is required.
|
115
|
-
#
|
116
|
-
# The host, port, username and password are represented in the
|
117
|
-
# authority component of the URI in the same way as in http URIs.
|
118
|
-
#
|
119
|
-
# The vhost is obtained from the first segment of the path, with the
|
120
|
-
# leading slash removed. The path should contain only a single
|
121
|
-
# segment (i.e, the only slash in it should be the leading one).
|
122
|
-
# If the vhost is to include slashes or other reserved URI
|
123
|
-
# characters, these should be percent-escaped.
|
124
|
-
#
|
125
|
-
# @example How vhost is parsed
|
126
|
-
#
|
127
|
-
# AMQP::Settings.parse_amqp_url("amqp://dev.rabbitmq.com") # => vhost is nil, so default (/) will be used
|
128
|
-
# AMQP::Settings.parse_amqp_url("amqp://dev.rabbitmq.com/") # => vhost is an empty string
|
129
|
-
# AMQP::Settings.parse_amqp_url("amqp://dev.rabbitmq.com/%2Fvault") # => vhost is /vault
|
130
|
-
# AMQP::Settings.parse_amqp_url("amqp://dev.rabbitmq.com/production") # => vhost is production
|
131
|
-
# AMQP::Settings.parse_amqp_url("amqp://dev.rabbitmq.com/a.b.c") # => vhost is a.b.c
|
132
|
-
# AMQP::Settings.parse_amqp_url("amqp://dev.rabbitmq.com/foo/bar") # => ArgumentError
|
133
|
-
#
|
134
|
-
#
|
135
|
-
# @param [String] connection_string AMQP connection URI, à la JDBC connection string. For example: amqp://bus.megacorp.internal:5877.
|
136
|
-
# @return [Hash] Connection parameters (:username, :password, :vhost, :host, :port, :ssl)
|
137
|
-
#
|
138
|
-
# @raise [ArgumentError] When connection URI schema is not amqp or amqps, or the path contains multiple segments
|
139
|
-
#
|
140
|
-
# @see http://bit.ly/ks8MXK Connecting to The Broker documentation guide
|
141
|
-
# @api public
|
142
|
-
def self.parse_amqp_url(connection_string)
|
143
|
-
uri = URI.parse(connection_string)
|
144
|
-
raise ArgumentError.new("Connection URI must use amqp or amqps schema (example: amqp://bus.megacorp.internal:5766), learn more at http://rubyamqp.info") unless %w{amqp amqps}.include?(uri.scheme)
|
145
|
-
|
146
|
-
opts = {}
|
147
|
-
|
148
|
-
opts[:scheme] = uri.scheme
|
149
|
-
opts[:user] = URI.unescape(uri.user) if uri.user
|
150
|
-
opts[:pass] = URI.unescape(uri.password) if uri.password
|
151
|
-
opts[:host] = uri.host if uri.host
|
152
|
-
opts[:port] = uri.port || AMQP::Settings::AMQP_PORTS[uri.scheme]
|
153
|
-
opts[:ssl] = uri.scheme == AMQP::Settings::AMQPS
|
154
|
-
if uri.path =~ %r{^/(.*)}
|
155
|
-
raise ArgumentError.new("#{uri} has multiple-segment path; please percent-encode any slashes in the vhost name (e.g. /production => %2Fproduction). Learn more at http://rubyamqp.info") if $1.index('/')
|
156
|
-
opts[:vhost] = URI.unescape($1)
|
157
|
-
end
|
158
|
-
|
159
|
-
opts
|
160
|
-
end
|
161
|
-
|
162
|
-
def self.parse_connection_uri(connection_string)
|
163
|
-
parse_amqp_url(connection_string)
|
164
|
-
end
|
165
23
|
end
|
166
24
|
end
|
data/lib/amqp/version.rb
CHANGED
@@ -36,7 +36,7 @@ describe "AMQP queue redeclaration with different attributes" do
|
|
36
36
|
channel.queue(name, options)
|
37
37
|
expect {
|
38
38
|
channel.queue(name, different_options)
|
39
|
-
}.to raise_error
|
39
|
+
}.to raise_error
|
40
40
|
|
41
41
|
done(0.5) {
|
42
42
|
@error_code.should == 406
|
@@ -62,7 +62,7 @@ describe "AMQP queue redeclaration with different attributes" do
|
|
62
62
|
channel.queue(name, options)
|
63
63
|
expect {
|
64
64
|
channel.queue(name, different_options)
|
65
|
-
}.to_not raise_error
|
65
|
+
}.to_not raise_error
|
66
66
|
|
67
67
|
done(0.5) {
|
68
68
|
@error_code.should == 406
|
@@ -16,10 +16,27 @@ describe AMQP do
|
|
16
16
|
s[:port].should == 5672
|
17
17
|
s[:user].should == "guest"
|
18
18
|
s[:pass].should == "guest"
|
19
|
-
s[:heartbeat].should
|
20
|
-
s[:auth_mechanism].should
|
19
|
+
s[:heartbeat].should be_nil
|
20
|
+
s[:auth_mechanism].should eq([])
|
21
21
|
end
|
22
22
|
|
23
|
+
describe "connection to RabbitMQ with a connection string" do
|
24
|
+
include EventedSpec::SpecHelper
|
25
|
+
|
26
|
+
em_before { AMQP.cleanup_state }
|
27
|
+
em_after { AMQP.cleanup_state }
|
28
|
+
|
29
|
+
it 'parses URI string' do
|
30
|
+
em do
|
31
|
+
AMQP.start("amqp://guest:guest@127.0.0.1?heartbeat=10&connection_timeout=100") do |session|
|
32
|
+
expect(session.heartbeat_interval).to eq(10)
|
33
|
+
expect(session.connection_timeout).to eq(100)
|
34
|
+
session.close
|
35
|
+
end
|
36
|
+
done(0.3)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
23
40
|
|
24
41
|
describe '.start' do
|
25
42
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: amqp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aman Gupta
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2018-01-02 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: eventmachine
|
@@ -32,14 +32,14 @@ dependencies:
|
|
32
32
|
requirements:
|
33
33
|
- - ">="
|
34
34
|
- !ruby/object:Gem::Version
|
35
|
-
version: 2.
|
35
|
+
version: 2.2.0
|
36
36
|
type: :runtime
|
37
37
|
prerelease: false
|
38
38
|
version_requirements: !ruby/object:Gem::Requirement
|
39
39
|
requirements:
|
40
40
|
- - ">="
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version: 2.
|
42
|
+
version: 2.2.0
|
43
43
|
description: Mature EventMachine-based RabbitMQ client.
|
44
44
|
email:
|
45
45
|
- michael@novemberain.com
|
@@ -48,28 +48,27 @@ executables: []
|
|
48
48
|
extensions: []
|
49
49
|
extra_rdoc_files:
|
50
50
|
- README.md
|
51
|
-
- docs/
|
52
|
-
- docs/AMQP091ModelExplained.textile
|
53
|
-
- docs/Bindings.textile
|
51
|
+
- docs/Exchanges.textile
|
54
52
|
- docs/Clustering.textile
|
55
|
-
- docs/
|
53
|
+
- docs/VendorSpecificExtensions.textile
|
54
|
+
- docs/PatternsAndUseCases.textile
|
55
|
+
- docs/Troubleshooting.textile
|
56
|
+
- docs/Bindings.textile
|
57
|
+
- docs/AMQP091ModelExplained.textile
|
58
|
+
- docs/Durability.textile
|
56
59
|
- docs/ConnectionEncryptionWithTLS.textile
|
60
|
+
- docs/TestingWithEventedSpec.textile
|
61
|
+
- docs/Queues.textile
|
57
62
|
- docs/DocumentationGuidesIndex.textile
|
58
|
-
- docs/Durability.textile
|
59
|
-
- docs/ErrorHandling.textile
|
60
|
-
- docs/Exchanges.textile
|
61
63
|
- docs/GettingStarted.textile
|
62
|
-
- docs/
|
63
|
-
- docs/
|
64
|
+
- docs/08Migration.textile
|
65
|
+
- docs/ConnectingToTheBroker.textile
|
66
|
+
- docs/ErrorHandling.textile
|
64
67
|
- docs/RabbitMQVersions.textile
|
65
68
|
- docs/RunningTests.textile
|
66
|
-
- docs/TestingWithEventedSpec.textile
|
67
|
-
- docs/Troubleshooting.textile
|
68
|
-
- docs/VendorSpecificExtensions.textile
|
69
69
|
files:
|
70
70
|
- ".gitignore"
|
71
71
|
- ".rspec"
|
72
|
-
- ".ruby-version"
|
73
72
|
- ".travis.yml"
|
74
73
|
- ".yardopts"
|
75
74
|
- ChangeLog.md
|
@@ -77,7 +76,7 @@ files:
|
|
77
76
|
- README.md
|
78
77
|
- Rakefile
|
79
78
|
- amqp.gemspec
|
80
|
-
- bin/ci/before_build
|
79
|
+
- bin/ci/before_build
|
81
80
|
- bin/cleanify.rb
|
82
81
|
- bin/docup
|
83
82
|
- bin/irb
|
@@ -300,7 +299,6 @@ files:
|
|
300
299
|
- spec/integration/tx_rollback_spec.rb
|
301
300
|
- spec/spec_helper.rb
|
302
301
|
- spec/unit/amqp/channel_id_allocation_spec.rb
|
303
|
-
- spec/unit/amqp/client_spec.rb
|
304
302
|
- spec/unit/amqp/connection_spec.rb
|
305
303
|
homepage: http://rubyamqp.info
|
306
304
|
licenses:
|
@@ -323,7 +321,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
323
321
|
version: '0'
|
324
322
|
requirements: []
|
325
323
|
rubyforge_project: amqp
|
326
|
-
rubygems_version: 2.
|
324
|
+
rubygems_version: 2.6.13
|
327
325
|
signing_key:
|
328
326
|
specification_version: 4
|
329
327
|
summary: Mature EventMachine-based RabbitMQ client
|
data/.ruby-version
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
2.3
|
@@ -1,104 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
require "amqp/settings"
|
6
|
-
|
7
|
-
describe AMQP::Settings do
|
8
|
-
|
9
|
-
#
|
10
|
-
# Examples
|
11
|
-
#
|
12
|
-
|
13
|
-
|
14
|
-
describe ".parse_connection_uri(connection_string)" do
|
15
|
-
context "when schema is not one of [amqp, amqps]" do
|
16
|
-
it "raises ArgumentError" do
|
17
|
-
expect {
|
18
|
-
described_class.parse_connection_uri("http://dev.rabbitmq.com")
|
19
|
-
}.to raise_error(ArgumentError, /amqp or amqps schema/)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
|
24
|
-
it "handles amqp:// URIs w/o path part" do
|
25
|
-
val = described_class.parse_connection_uri("amqp://dev.rabbitmq.com")
|
26
|
-
|
27
|
-
val[:vhost].should be_nil # in this case, default / will be used
|
28
|
-
val[:host].should == "dev.rabbitmq.com"
|
29
|
-
val[:port].should == 5672
|
30
|
-
val[:scheme].should == "amqp"
|
31
|
-
val[:ssl].should be_false
|
32
|
-
end
|
33
|
-
|
34
|
-
it "handles amqps:// URIs w/o path part" do
|
35
|
-
val = described_class.parse_connection_uri("amqps://dev.rabbitmq.com")
|
36
|
-
|
37
|
-
val[:vhost].should be_nil
|
38
|
-
val[:host].should == "dev.rabbitmq.com"
|
39
|
-
val[:port].should == 5671
|
40
|
-
val[:scheme].should == "amqps"
|
41
|
-
val[:ssl].should be_true
|
42
|
-
end
|
43
|
-
|
44
|
-
|
45
|
-
context "when URI ends in a slash" do
|
46
|
-
it "parses vhost as an empty string" do
|
47
|
-
val = described_class.parse_connection_uri("amqp://dev.rabbitmq.com/")
|
48
|
-
|
49
|
-
val[:host].should == "dev.rabbitmq.com"
|
50
|
-
val[:port].should == 5672
|
51
|
-
val[:scheme].should == "amqp"
|
52
|
-
val[:ssl].should be_false
|
53
|
-
val[:vhost].should == ""
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
|
58
|
-
context "when URI ends in /%2Fvault" do
|
59
|
-
it "parses vhost as /vault" do
|
60
|
-
val = described_class.parse_connection_uri("amqp://dev.rabbitmq.com/%2Fvault")
|
61
|
-
|
62
|
-
val[:host].should == "dev.rabbitmq.com"
|
63
|
-
val[:port].should == 5672
|
64
|
-
val[:scheme].should == "amqp"
|
65
|
-
val[:ssl].should be_false
|
66
|
-
val[:vhost].should == "/vault"
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
|
71
|
-
context "when URI is amqp://dev.rabbitmq.com/a.path.without.slashes" do
|
72
|
-
it "parses vhost as a.path.without.slashes" do
|
73
|
-
val = described_class.parse_connection_uri("amqp://dev.rabbitmq.com/a.path.without.slashes")
|
74
|
-
|
75
|
-
val[:host].should == "dev.rabbitmq.com"
|
76
|
-
val[:port].should == 5672
|
77
|
-
val[:scheme].should == "amqp"
|
78
|
-
val[:ssl].should be_false
|
79
|
-
val[:vhost].should == "a.path.without.slashes"
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
context "when URI is amqp://dev.rabbitmq.com/a/path/with/slashes" do
|
84
|
-
it "raises an ArgumentError" do
|
85
|
-
lambda { described_class.parse_connection_uri("amqp://dev.rabbitmq.com/a/path/with/slashes") }.should raise_error(ArgumentError)
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
|
90
|
-
context "when URI has username:password, for instance, amqp://hedgehog:t0ps3kr3t@hub.megacorp.internal" do
|
91
|
-
it "parses them out" do
|
92
|
-
val = described_class.parse_connection_uri("amqp://hedgehog:t0ps3kr3t@hub.megacorp.internal")
|
93
|
-
|
94
|
-
val[:host].should == "hub.megacorp.internal"
|
95
|
-
val[:port].should == 5672
|
96
|
-
val[:scheme].should == "amqp"
|
97
|
-
val[:ssl].should be_false
|
98
|
-
val[:user].should == "hedgehog"
|
99
|
-
val[:pass].should == "t0ps3kr3t"
|
100
|
-
val[:vhost].should be_nil # in this case, default / will be used
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|