amqp 1.3.0 → 1.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c7cd9670c82561f472831d5844d8aedf21704384
4
- data.tar.gz: 72de0158e4620a8c11468fa6ae141770f5eb5c40
3
+ metadata.gz: a27af25790fbbfceee41b2ed96246b3e3736624a
4
+ data.tar.gz: 2dbac00d7f5e582cb91c6b6fa4ee4510fcceb8df
5
5
  SHA512:
6
- metadata.gz: 0590210e5493862466fc7c5bfaae3322f4fcd4c738f57eba25e811d4d76205b51b6bf327c44941f59a6b93a24436d6961baaafefeaf64c88b378a7faa6a24dba
7
- data.tar.gz: b579abed8e4432158e908dd6d4e992c17e815029b89b3ccb6b0a7b15483eb2bb21a7dc49df7fe389e4d9adc04660b19d0dd8ef620a15578d880b18181932cfa9
6
+ metadata.gz: 8f218bcdf94cd7e0a02a82717860c63d8476a7a48ab08c965a9639197d6cdb815a3fb18ca4c7ac4de73bd8ef78aae594b8cca4fd6c3c25ce59499ef2ee9acddf
7
+ data.tar.gz: 21df041f087ba88c6fd67f64c9a12869c411f48cdd270d9e16fe6578df5d80f7631094de05e7cc920bc9c9fdf7c5be07f6a0be55bdfe424b2aa432e3a04bc98b
@@ -1,3 +1,11 @@
1
+ ## Changes Between 1.3.x and 1.4.0
2
+
3
+ ### connection.blocked Support
4
+
5
+ [connection.blocked](https://www.rabbitmq.com/connection-blocked.html) notifications
6
+ are now correctly supported by the library.
7
+
8
+
1
9
  ## Changes Between 1.2.x and 1.3.0
2
10
 
3
11
  ### Exchange-to-Exchange Bindings Support
data/README.md CHANGED
@@ -1,20 +1,26 @@
1
1
  # Ruby amqp gem: the asynchronous Ruby RabbitMQ client
2
2
 
3
- [Ruby amqp gem](http://rubyamqp.info) is a widely used, feature-rich, well-maintained asynchronous RabbitMQ client with batteries included.
4
- This library works with
3
+ [Ruby amqp gem](http://rubyamqp.info) is a feature-rich,
4
+ EventMachine-based RabbitMQ client with batteries included.
5
+
6
+ It implement [AMQP
7
+ 0.9.1](http://www.rabbitmq.com/tutorials/amqp-concepts.html) and
8
+ support [RabbitMQ extensions to AMQP
9
+ 0.9.1](http://www.rabbitmq.com/extensions.html).
5
10
 
6
- * Ruby 2.1
7
- * Ruby 2.0
8
- * Ruby 1.9.3
9
- * [JRuby](http://jruby.org)
10
- * [Rubinius](http://rubini.us)
11
- * Ruby 1.9.2
12
- * Ruby 1.8.7
13
- * [REE](http://www.rubyenterpriseedition.com),
14
11
 
15
- and is licensed under the [Ruby License](http://www.ruby-lang.org/en/LICENSE.txt)
12
+ ## A Word of Warning: Use This Only If You Already Use EventMachine
16
13
 
17
- 0.8.0 and later versions of amqp gem implement [AMQP 0.9.1](http://www.rabbitmq.com/tutorials/amqp-concepts.html) (see also [AMQP 0.9.1 spec document](http://bit.ly/amqp091spec)) and support [RabbitMQ extensions to AMQP 0.9.1](http://www.rabbitmq.com/extensions.html).
14
+ Unless you **already use EventMachine**, there is no real reason to
15
+ use this client. Consider [Bunny](http://rubybunny.info) or [March Hare](http://rubymarchhare.info) instead.
16
+
17
+ amqp gem brings in a fair share of EventMachine complexity which
18
+ cannot be fully eliminated. Event loop blocking, writes that happen
19
+ at the end of loop tick, uncaught exceptions in event loop silently killing it:
20
+ it's not worth the pain unless you've already deeply invested in EventMachine
21
+ and understand how it works.
22
+
23
+ So, just use Bunny or March Hare. You will be much happier.
18
24
 
19
25
 
20
26
  ## I know what RabbitMQ is, how do I get started?
@@ -126,6 +132,20 @@ and is written in a form of a tutorial. See [AMQP 0.9.1 Model Explained](http://
126
132
  to learn more about RabbitMQ protocol principles & concepts.
127
133
 
128
134
 
135
+ ## Supported Ruby Versions
136
+
137
+ This library works with
138
+
139
+ * Ruby 2.1
140
+ * Ruby 2.0
141
+ * Ruby 1.9.3
142
+ * [JRuby](http://jruby.org)
143
+ * [Rubinius](http://rubini.us)
144
+ * Ruby 1.9.2
145
+ * Ruby 1.8.7
146
+ * [REE](http://www.rubyenterpriseedition.com),
147
+
148
+
129
149
 
130
150
  ## Documentation: tutorials, guides & API reference
131
151
 
@@ -211,7 +231,7 @@ amqp gem is maintained by [Michael Klishin](http://twitter.com/michaelklishin).
211
231
 
212
232
  ## License ##
213
233
 
214
- AMQP gem is licensed under the [Ruby License](http://www.ruby-lang.org/en/LICENSE.txt).
234
+ amqp gem is licensed under the [Ruby License](http://www.ruby-lang.org/en/LICENSE.txt).
215
235
 
216
236
 
217
237
 
@@ -247,34 +267,6 @@ Special thanks to Dmitriy Samovskiy, Ben Hood and Tony Garnock-Jones.
247
267
 
248
268
 
249
269
 
250
- ## (Very) Short FAQ ##
251
-
252
- ### So, does amqp gem only work with RabbitMQ?
253
-
254
- This library is developed and tested primarily with [RabbitMQ](http://rabbitmq.com), although it should be compatible with any
255
- server implementing the [AMQP 0.9.1 spec](http://bit.ly/hw2ELX). For AMQP 0.8 brokers, use amqp gem version 0.7.x.
256
-
257
- ### Why isn't Ruby 1.8.7-p249 supported? Will it be supported in the future?
258
-
259
- In order to make code like the following (pseudo-synchronous) work
260
-
261
- ``` ruby
262
- conn = AMQP.connect
263
- ch = AMQP::Channel.new(conn)
264
-
265
- ex = ch.default_exchange
266
- ex.publish(some_data)
267
- ```
268
-
269
- and not be affected by this [Ruby 1.8.7-p249-specific bug (super called outside of method)](http://bit.ly/iONBmH), we need to
270
- avoid any inheritance for key amqp gem classes: Channel, Queue, Exchange, Consumer. This will take a significant refactoring effort and
271
- we do not expect this to change at this time.
272
-
273
-
274
- ### How does amqp gem relate to amq-client gem, amq-protocol and libraries like Bunny?
275
-
276
- See [this page about AMQP gems family](https://github.com/ruby-amqp/amq-client/blob/master/README.textile)
277
-
278
270
 
279
271
  [![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/ruby-amqp/amqp/trend.png)](https://bitdeli.com/free "Bitdeli Badge")
280
272
 
@@ -113,13 +113,6 @@ module AMQP
113
113
  @channel.once_open do
114
114
  @queue.once_declared do
115
115
  @connection.send_frame(AMQ::Protocol::Basic::Cancel.encode(@channel.id, @consumer_tag, nowait))
116
- self.clear_callbacks(:delivery)
117
- self.clear_callbacks(:consume)
118
- self.clear_callbacks(:scancel)
119
-
120
- self.unregister_with_channel
121
- self.unregister_with_queue
122
-
123
116
  if !nowait
124
117
  self.redefine_callback(:cancel, &block)
125
118
  @channel.consumers_awaiting_cancel_ok.push(self)
@@ -304,6 +297,11 @@ module AMQP
304
297
  end # handle_consume_ok(consume_ok)
305
298
 
306
299
  def handle_cancel_ok(cancel_ok)
300
+ self.exec_callback_once(:cancel, cancel_ok)
301
+
302
+ self.unregister_with_channel
303
+ self.unregister_with_queue
304
+
307
305
  @consumer_tag = nil
308
306
 
309
307
  # detach from object graph so that this object will be garbage-collected
@@ -311,7 +309,10 @@ module AMQP
311
309
  @channel = nil
312
310
  @connection = nil
313
311
 
314
- self.exec_callback_once(:cancel, cancel_ok)
312
+ self.clear_callbacks(:delivery)
313
+ self.clear_callbacks(:consume)
314
+ self.clear_callbacks(:cancel)
315
+ self.clear_callbacks(:scancel)
315
316
  end # handle_cancel_ok(method)
316
317
 
317
318
 
@@ -396,6 +396,18 @@ module AMQP
396
396
  # @endgroup
397
397
 
398
398
 
399
+ # @group Blocked connection notifications
400
+
401
+ def on_blocked(&fn)
402
+ @on_blocked = fn
403
+ end
404
+
405
+ def on_unblocked(&fn)
406
+ @on_unblocked = fn
407
+ end
408
+
409
+ # @endgroup
410
+
399
411
 
400
412
  #
401
413
  # Implementation
@@ -600,7 +612,7 @@ module AMQP
600
612
  # now we can set it. MK.
601
613
  @had_successfully_connected_before = true
602
614
  @reconnecting = false
603
- @handling_skipped_hearbeats = false
615
+ @handling_skipped_heartbeats = false
604
616
  @last_server_heartbeat = Time.now
605
617
 
606
618
  self.handshake
@@ -687,9 +699,9 @@ module AMQP
687
699
  # heartbeat interval set via :heartbeat_interval option on connection.
688
700
  #
689
701
  # @api plugin
690
- def handle_skipped_hearbeats
691
- if !@handling_skipped_hearbeats && @tcp_connection_established && !@intentionally_closing_connection
692
- @handling_skipped_hearbeats = true
702
+ def handle_skipped_heartbeats
703
+ if !@handling_skipped_heartbeats && @tcp_connection_established && !@intentionally_closing_connection
704
+ @handling_skipped_heartbeats = true
693
705
  self.cancel_heartbeat_sender
694
706
 
695
707
  self.run_skipped_heartbeats_callbacks
@@ -963,10 +975,10 @@ module AMQP
963
975
  # Sends a heartbeat frame if connection is open.
964
976
  # @api plugin
965
977
  def send_heartbeat
966
- if tcp_connection_established? && !@handling_skipped_hearbeats && @last_server_heartbeat
978
+ if tcp_connection_established? && !@handling_skipped_heartbeats && @last_server_heartbeat
967
979
  if @last_server_heartbeat < (Time.now - (self.heartbeat_interval * 2)) && !reconnecting?
968
980
  logger.error "[amqp] Detected missing server heartbeats"
969
- self.handle_skipped_hearbeats
981
+ self.handle_skipped_heartbeats
970
982
  end
971
983
  send_frame(AMQ::Protocol::HeartbeatFrame)
972
984
  end
@@ -1055,6 +1067,13 @@ module AMQP
1055
1067
  end # handle_close_ok(close_ok)
1056
1068
 
1057
1069
 
1070
+ def handle_connection_blocked(connection_blocked)
1071
+ @on_blocked.call(self, connection_blocked) if @on_blocked
1072
+ end
1073
+
1074
+ def handle_connection_unblocked(connection_unblocked)
1075
+ @on_unblocked.call(self, connection_unblocked) if @on_unblocked
1076
+ end
1058
1077
 
1059
1078
  protected
1060
1079
 
@@ -1125,6 +1144,13 @@ module AMQP
1125
1144
  connection.handle_close_ok(frame.decode_payload)
1126
1145
  end
1127
1146
 
1147
+ self.handle(AMQ::Protocol::Connection::Blocked) do |connection, frame|
1148
+ connection.handle_connection_blocked(frame.decode_payload)
1149
+ end
1150
+
1151
+ self.handle(AMQ::Protocol::Connection::Unblocked) do |connection, frame|
1152
+ connection.handle_connection_unblocked(frame.decode_payload)
1153
+ end
1128
1154
 
1129
1155
 
1130
1156
 
@@ -45,7 +45,15 @@ module AMQP
45
45
  :platform => ::RUBY_DESCRIPTION,
46
46
  :product => "amqp gem",
47
47
  :information => "http://github.com/ruby-amqp/amqp",
48
- :version => AMQP::VERSION
48
+ :version => AMQP::VERSION,
49
+ :capabilities => {
50
+ :publisher_confirms => true,
51
+ :consumer_cancel_notify => true,
52
+ :exchange_exchange_bindings => true,
53
+ :"basic.nack" => true,
54
+ :"connection.blocked" => true,
55
+ :authentication_failure_close => true
56
+ }
49
57
  }
50
58
 
51
59
  def self.client_properties
@@ -6,5 +6,5 @@ module AMQP
6
6
  #
7
7
  # @see AMQ::Protocol::VERSION
8
8
  # @return [String] AMQP gem version
9
- VERSION = '1.3.0'
9
+ VERSION = '1.4.0'
10
10
  end
@@ -54,7 +54,7 @@ describe AMQP::Channel do
54
54
  source.publish("x")
55
55
  end
56
56
  end
57
- done(0.1) { messages.should == ["x"] }
57
+ done(0.5) { messages.should == ["x"] }
58
58
  end
59
59
 
60
60
  it "can be unbound" do
@@ -82,7 +82,7 @@ describe AMQP::Channel do
82
82
  destination.bind(source, :nowait => true) do
83
83
  callback_called = true
84
84
  end
85
- done(0.1) { callback_called.should be_false}
85
+ done(0.5) { callback_called.should be_false}
86
86
  end
87
87
 
88
88
  end #context
@@ -92,16 +92,15 @@ describe AMQP::Channel do
92
92
  source = @channel.topic("topic-exchange-source")
93
93
  destination = @channel.topic("topic-exchange-destination")
94
94
  messages = []
95
- destination.bind(source) do
95
+ destination.bind(source, :routing_key => "#") do
96
96
  queue = @channel.queue("ex-to-ex-default-key", :auto_delete => true)
97
- queue.subscribe do |metadata, payload|
97
+ queue.bind(destination, :routing_key => "#").subscribe do |metadata, payload|
98
98
  messages << payload
99
99
  end
100
- queue.bind(destination, :routing_key => "#") do
101
- source.publish("a", :routing_key => "lalalala")
102
- end
100
+
101
+ source.publish("a", :routing_key => "lalalala")
103
102
  end
104
- done(0.1) { messages.should == ["a"] }
103
+ done(0.5) { messages.should == ["a"] }
105
104
  end
106
105
 
107
106
  it "using routing key 'foo'" do
@@ -117,7 +116,7 @@ describe AMQP::Channel do
117
116
  source.publish("b", :routing_key => "foo")
118
117
  end
119
118
  end
120
- done(0.1) { messages.should == ["b"]}
119
+ done(0.5) { messages.should == ["b"]}
121
120
  end
122
121
  end #context
123
122
  end # describe
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.3.0
4
+ version: 1.4.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: 2014-02-03 00:00:00.000000000 Z
13
+ date: 2014-06-24 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: eventmachine
@@ -324,7 +324,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
324
324
  version: '0'
325
325
  requirements: []
326
326
  rubyforge_project: amqp
327
- rubygems_version: 2.1.11
327
+ rubygems_version: 2.2.2
328
328
  signing_key:
329
329
  specification_version: 4
330
330
  summary: Widely used, feature-rich asynchronous RabbitMQ client with batteries included