amqp 1.3.0 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
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