bunny 1.1.0 → 1.1.1

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: 792b20042a60213fee5730fc4bf771dfe034d6bd
4
- data.tar.gz: bd74266e1abd735322c449565e7d4041b3a51e09
3
+ metadata.gz: 549beacd9dcbe811dd5ad11c61efa51746eda01f
4
+ data.tar.gz: ed9a4c5d128c707122504fdfdae94556794d5633
5
5
  SHA512:
6
- metadata.gz: 92377d74df1988a233dd3f7f296dd5b9b3b328f38138e7e8b64afc1a0a42e1883945e0f64859ad7309bbf1b30a764ac8025be38cf90b0af93b73306f04baceea
7
- data.tar.gz: ca8e3dd099586e3f784b7db55c6a2f8de8c68b279bb0d75ea5f6456e37161c05bab2e613c4120966c5ee98d468e1a07ab387e6fdc281d4e1435478a931c4cf9f
6
+ metadata.gz: c3c90fb4df6a1ae0edff196e9b4cea4f2c7fc424b184dc6bc3b4215af3f01149442c57fd3eea2d857b733c05ebb2eb0d7530bb704fb55a50d832422a16a616bd
7
+ data.tar.gz: 87b6dc534478f963b80a82b06a4ccfbfb21bbbc01ee07c580e525bda26e0c86969d6b64890bac8afcd1b456f632b8edd537f61eca2fdf6dbf644453f99e5cdba
@@ -1,4 +1,18 @@
1
- ## Changes between Bunny 1.1.0.rc1 and 1.1.0.rc2
1
+ ## Changes between Bunny 1.1.0 and 1.1.1
2
+
3
+ ### Uncaught Consumer Exceptions
4
+
5
+ Uncaught consumer exceptions are now handled by uncaught exceptions
6
+ handler that can be defined per channel:
7
+
8
+ ``` ruby
9
+ ch.on_uncaught_exception do |e, consumer|
10
+ # ...
11
+ end
12
+ ```
13
+
14
+
15
+ ## Changes between Bunny 1.1.0.rc1 and 1.1.0
2
16
 
3
17
  ### Synchronized Session#create_channel and Session#close_channel
4
18
 
@@ -193,6 +193,9 @@ module Bunny
193
193
  @next_publish_seq_no = 0
194
194
 
195
195
  @recoveries_counter = Bunny::Concurrent::AtomicFixnum.new(0)
196
+ @uncaught_exception_handler = Proc.new do |e, consumer|
197
+ @logger.error "Uncaught exception from consumer #{consumer.to_s}: #{e.message}"
198
+ end
196
199
  end
197
200
 
198
201
  attr_reader :recoveries_counter
@@ -1406,6 +1409,13 @@ module Bunny
1406
1409
  @on_error = block
1407
1410
  end
1408
1411
 
1412
+ # Defines a handler for uncaught exceptions in consumers
1413
+ # (e.g. delivered message handlers).
1414
+ #
1415
+ # @api public
1416
+ def on_uncaught_exception(&block)
1417
+ @uncaught_exception_handler = block
1418
+ end
1409
1419
 
1410
1420
  #
1411
1421
  # Recovery
@@ -1569,6 +1579,7 @@ module Bunny
1569
1579
  consumer.handle_cancellation(method)
1570
1580
  rescue Exception => e
1571
1581
  @logger.error "Got exception when notifying consumer #{method.consumer_tag} about cancellation!"
1582
+ @uncaught_exception_handler.call(e, consumer) if @uncaught_exception_handler
1572
1583
  end
1573
1584
  end
1574
1585
  else
@@ -1627,7 +1638,11 @@ module Bunny
1627
1638
  consumer = @consumers[basic_deliver.consumer_tag]
1628
1639
  if consumer
1629
1640
  @work_pool.submit do
1630
- consumer.call(DeliveryInfo.new(basic_deliver, consumer, self), MessageProperties.new(properties), content)
1641
+ begin
1642
+ consumer.call(DeliveryInfo.new(basic_deliver, consumer, self), MessageProperties.new(properties), content)
1643
+ rescue StandardError => e
1644
+ @uncaught_exception_handler.call(e, consumer) if @uncaught_exception_handler
1645
+ end
1631
1646
  end
1632
1647
  else
1633
1648
  @logger.warn "No consumer for tag #{basic_deliver.consumer_tag} on channel #{@id}!"
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Bunny
4
4
  # @return [String] Version of the library
5
- VERSION = "1.1.0"
5
+ VERSION = "1.1.1"
6
6
  end
@@ -222,4 +222,123 @@ describe Bunny::Queue, "#subscribe" do
222
222
  end
223
223
  end
224
224
 
225
+
226
+ context "with uncaught exceptions in delivery handler" do
227
+ context "and defined exception handler" do
228
+ let(:queue_name) { "bunny.basic_consume#{rand}" }
229
+
230
+ it "uses exception handler" do
231
+ caught = nil
232
+ t = Thread.new do
233
+ ch = connection.create_channel
234
+ q = ch.queue(queue_name, :auto_delete => true, :durable => false)
235
+
236
+ ch.on_uncaught_exception do |e, consumer|
237
+ caught = e
238
+ end
239
+
240
+ q.subscribe(:exclusive => false, :manual_ack => false) do |delivery_info, properties, payload|
241
+ raise RuntimeError.new(queue_name)
242
+ end
243
+ end
244
+ t.abort_on_exception = true
245
+ sleep 0.5
246
+
247
+ ch = connection.create_channel
248
+ x = ch.default_exchange
249
+ x.publish("hello", :routing_key => queue_name)
250
+ sleep 0.5
251
+
252
+ caught.message.should == queue_name
253
+
254
+ ch.close
255
+ end
256
+ end
257
+
258
+
259
+ context "and default exception handler" do
260
+ let(:queue_name) { "bunny.basic_consume#{rand}" }
261
+
262
+ it "uses exception handler" do
263
+ t = Thread.new do
264
+ ch = connection.create_channel
265
+ q = ch.queue(queue_name, :auto_delete => true, :durable => false)
266
+
267
+ q.subscribe(:exclusive => false, :manual_ack => false) do |delivery_info, properties, payload|
268
+ raise RuntimeError.new(queue_name)
269
+ end
270
+ end
271
+ t.abort_on_exception = true
272
+ sleep 0.5
273
+
274
+ ch = connection.create_channel
275
+ x = ch.default_exchange
276
+ 5.times { x.publish("hello", :routing_key => queue_name) }
277
+ sleep 1.5
278
+
279
+ ch.close
280
+ end
281
+ end
282
+
283
+
284
+ context "with a single consumer" do
285
+ let(:queue_name) { "bunny.basic_consume#{rand}" }
286
+
287
+ it "provides delivery tag access" do
288
+ delivery_tags = SortedSet.new
289
+
290
+ cch = connection.create_channel
291
+ q = cch.queue(queue_name, :auto_delete => true, :durable => false)
292
+ q.subscribe(:exclusive => false, :manual_ack => false) do |delivery_info, properties, payload|
293
+ delivery_tags << delivery_info.delivery_tag
294
+ end
295
+ sleep 0.5
296
+
297
+ ch = connection.create_channel
298
+ x = ch.default_exchange
299
+ 100.times do
300
+ x.publish("hello", :routing_key => queue_name)
301
+ end
302
+
303
+ sleep 1.0
304
+ delivery_tags.should == SortedSet.new(Range.new(1, 100).to_a)
305
+
306
+ ch.queue(queue_name, :auto_delete => true, :durable => false).message_count.should == 0
307
+
308
+ ch.close
309
+ end
310
+ end
311
+
312
+
313
+ context "with multiple consumers on the same channel" do
314
+ let(:queue_name) { "bunny.basic_consume#{rand}" }
315
+
316
+ it "provides delivery tag access" do
317
+ delivery_tags = SortedSet.new
318
+
319
+ cch = connection.create_channel
320
+ q = cch.queue(queue_name, :auto_delete => true, :durable => false)
321
+
322
+ 7.times do
323
+ q.subscribe(:exclusive => false, :manual_ack => false) do |delivery_info, properties, payload|
324
+ delivery_tags << delivery_info.delivery_tag
325
+ end
326
+ end
327
+ sleep 1.0
328
+
329
+ ch = connection.create_channel
330
+ x = ch.default_exchange
331
+ 100.times do
332
+ x.publish("hello", :routing_key => queue_name)
333
+ end
334
+
335
+ sleep 1.5
336
+ delivery_tags.should == SortedSet.new(Range.new(1, 100).to_a)
337
+
338
+ ch.queue(queue_name, :auto_delete => true, :durable => false).message_count.should == 0
339
+
340
+ ch.close
341
+ end
342
+ end
343
+ end
225
344
  end # describe
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bunny
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Duncan
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2014-01-12 00:00:00.000000000 Z
15
+ date: 2014-01-30 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: amq-protocol