bunny 2.2.2 → 2.3.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: cee8bb663b9c828e0e82293ad144c29119114e94
4
- data.tar.gz: f1186b143dde46b7a64ca23dfe664ca2daf04d09
3
+ metadata.gz: e10debc2fea6cb3ed014eeebdef45e41e7dad3b4
4
+ data.tar.gz: 12d0bb9c3a0878b4831c2fe448fe09a0a0207c6d
5
5
  SHA512:
6
- metadata.gz: 6ef4487153f5b27349a6a93bf3248acbf3da3bbe8359ae786542fced024227bec545b23323cc939ec85e43da934891d98a50657b479ecd837b97062800c21cd1
7
- data.tar.gz: 36698772a5428eb1c3ff7c5ce877c95529e93aaf207eab6afa8e068f161e9824841c852fbe9751a485d34bdc9e7b1d7d4b4e5d83eb59788c9e4544a06a480f03
6
+ metadata.gz: ac653c25bc8bd4b8da57e68e0f077f2466eb374da3427f24a9ce62d87cd980246d1785728cf55969d90806bee886390f4ec625732a65903722704d8faa0308f3
7
+ data.tar.gz: b7d5b2b007e2f1a13240f44df4bcb302155f4d4333950d73ec38e492f3526e971fc2094963489c68af0f13664c906c00eb793dc195ded4d3f829ba7e4d0bd550
@@ -1,13 +1,11 @@
1
1
  language: ruby
2
2
  bundler_args: --without development
3
+ cache: bundler
3
4
  before_script: "./bin/ci/before_build"
4
5
  script: "bundle exec rspec -cf documentation spec"
5
6
  rvm:
6
- - "2.2"
7
- - "2.1"
8
- - "2.0"
9
- - "jruby"
10
- - "rbx"
7
+ - "2.3.0"
8
+ - "2.2.2"
11
9
  notifications:
12
10
  email: michael@rabbitmq.com
13
11
  services:
@@ -15,8 +13,3 @@ services:
15
13
  branches:
16
14
  only:
17
15
  - master
18
- - 1.4.x-stable
19
- matrix:
20
- allow_failures:
21
- - rvm: rbx
22
- - rvm: jruby
@@ -1,12 +1,21 @@
1
- ## Changes between Bunny 2.2.1 and 2.2.2
1
+ ## Changes between Bunny 2.2.0 and 2.3.0 (Feb 26th, 2016)
2
2
 
3
- ### amq-protocol Update
3
+ ### Thread#abort_on_exception Setting for Consumer Work Pool Threads
4
+
5
+ `Bunny::Session#create_channel` now supports a 3rd argument that,
6
+ when set to `true`, makes consumer work pool threads to have
7
+ `Thread#abort_on_exception` set on them.
8
+
9
+ Contributed by Seamus Abshere.
4
10
 
5
- Minimum `amq-protocol` version is now `2.0.1` which includes
6
- bug fixes.
11
+ ### Explicit Transport Closure on Recovery
7
12
 
13
+ Bunny now will explicitly close previosly used transport before starting
14
+ connection recovery.
8
15
 
9
- ## Changes between Bunny 2.2.0 and 2.2.1
16
+ GitHub issue: [#377](https://github.com/ruby-amqp/bunny/pull/377).
17
+
18
+ Contributed by bkanhoopla.
10
19
 
11
20
  ### No TLS Socket Double-init
12
21
 
@@ -16,9 +25,15 @@ GH issue: [#345](https://github.com/ruby-amqp/bunny/issues/345).
16
25
 
17
26
  Contributed by Carl Hörberg.
18
27
 
28
+ ### Lazily Evaluated Debug Log Strings
29
+
30
+ GH issue: [#375](https://github.com/ruby-amqp/bunny/pull/375)
31
+
32
+ Contributed by Omer Katz.
19
33
 
20
34
 
21
- ## Changes between Bunny 2.1.0 and 2.2.0
35
+
36
+ ## Changes between Bunny 2.1.0 and 2.2.0 (Sep 6th, 2015)
22
37
 
23
38
  ### Add :addresses to connect options
24
39
 
@@ -26,6 +41,8 @@ Before this the connection options only allowed multiple hosts, an
26
41
  address is a combination of a host and a port. This makes it possible to
27
42
  specify different hosts with different ports.
28
43
 
44
+ Contributed by Bart van Zon (Tele2).
45
+
29
46
  ### Recover from connection.close by default
30
47
 
31
48
  Bunny will now try to reconnect also when server sent connection.close is
@@ -33,6 +50,9 @@ received, e.g. when a server is restarting (but also when the connection is
33
50
  force closed by the server). This is in-line with how many other clients behave.
34
51
  The old default was `recover_from_connection_close: false`.
35
52
 
53
+ Contributed by Carl Hörberg (CloudAMQP).
54
+
55
+
36
56
  ## Changes between Bunny 2.0.0 and 2.1.0
37
57
 
38
58
  Bunny 2.1.0 has an **important breaking change**. It is highly
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2009 – 2015 Chris Duncan, Jakub Stastny aka botanicus,
1
+ Copyright (c) 2009 – 2016 Chris Duncan, Jakub Stastny aka botanicus,
2
2
  Michael S. Klishin, Eric Lindvall, Stefan Kaes and contributors.
3
3
 
4
4
  Permission is hereby granted, free of charge, to any person obtaining
data/README.md CHANGED
@@ -51,7 +51,7 @@ Modern Bunny versions support
51
51
  * CRuby 2.2, 2.1, 2.0
52
52
 
53
53
  Bunny works sufficiently well on JRuby but there are known
54
- JRuby bugs that cause high CPU burn. JRuby users should
54
+ JRuby bugs in versions prior to JRuby 9000 that cause high CPU burn. JRuby users should
55
55
  use [March Hare](http://rubymarchhare.info).
56
56
 
57
57
  Bunny `1.7.x` was the last version to support CRuby 1.9.3 and 1.8.7
@@ -88,7 +88,7 @@ gem install bunny
88
88
  To use Bunny in a project managed with Bundler:
89
89
 
90
90
  ``` ruby
91
- gem "bunny", ">= 2.1.0"
91
+ gem "bunny", ">= 2.2.2"
92
92
  ```
93
93
 
94
94
 
@@ -158,9 +158,9 @@ Other documentation guides are available at [rubybunny.info](http://rubybunny.in
158
158
  to also join the [RabbitMQ mailing list](https://groups.google.com/forum/#!forum/rabbitmq-users) mailing list. Feel free to ask any questions that you may have.
159
159
 
160
160
 
161
- ### IRC
161
+ ## Continuous Integration
162
162
 
163
- For more immediate help, please join `#rabbitmq` on `irc.freenode.net`.
163
+ [![Build Status](https://travis-ci.org/ruby-amqp/bunny.png)](https://travis-ci.org/ruby-amqp/bunny/)
164
164
 
165
165
 
166
166
  ### News & Announcements on Twitter
@@ -11,14 +11,6 @@ require 'bunny'
11
11
  conn = Bunny.new(:heartbeat_interval => 8)
12
12
  conn.start
13
13
 
14
- begin
15
- ch1 = conn.create_channel
16
- ch1.queue_delete("queue_that_should_not_exist#{rand}")
17
- rescue Bunny::NotFound => e
18
- puts "Channel-level exception! Code: #{e.channel_close.reply_code}, message: #{e.channel_close.reply_text}"
19
- end
20
-
21
-
22
14
  begin
23
15
  ch2 = conn.create_channel
24
16
  q = "bunny.examples.recovery.q#{rand}"
@@ -4,6 +4,8 @@
4
4
  require "rubygems"
5
5
  require "bunny"
6
6
 
7
+ STDOUT.sync = true
8
+
7
9
  puts "=> Demonstrating alternate exchanges"
8
10
  puts
9
11
 
@@ -4,6 +4,8 @@
4
4
  require "rubygems"
5
5
  require "bunny"
6
6
 
7
+ STDOUT.sync = true
8
+
7
9
  conn = Bunny.new
8
10
  conn.start
9
11
 
@@ -4,6 +4,8 @@
4
4
  require "rubygems"
5
5
  require "bunny"
6
6
 
7
+ STDOUT.sync = true
8
+
7
9
  connection = Bunny.new
8
10
  connection.start
9
11
 
@@ -4,6 +4,8 @@
4
4
  require "rubygems"
5
5
  require "bunny"
6
6
 
7
+ STDOUT.sync = true
8
+
7
9
  conn = Bunny.new
8
10
  conn.start
9
11
 
@@ -4,6 +4,8 @@
4
4
  require "rubygems"
5
5
  require "bunny"
6
6
 
7
+ STDOUT.sync = true
8
+
7
9
  puts "=> Subscribing for messages using explicit acknowledgements model"
8
10
  puts
9
11
 
@@ -618,14 +618,14 @@ module Bunny
618
618
  # implementation (and even more correct and convenient ones, such as wait/notify, should
619
619
  # we implement them). So we return a triple of nils immediately which apps should be
620
620
  # able to handle anyway as "got no message, no need to act". MK.
621
- @last_basic_get_response = if @connection.open?
622
- wait_on_basic_get_continuations
623
- else
624
- [nil, nil, nil]
625
- end
621
+ last_basic_get_response = if @connection.open?
622
+ wait_on_basic_get_continuations
623
+ else
624
+ [nil, nil, nil]
625
+ end
626
626
 
627
627
  raise_if_continuation_resulted_in_a_channel_error!
628
- @last_basic_get_response
628
+ last_basic_get_response
629
629
  end
630
630
 
631
631
  # prefetch_count is of type short in the protocol. MK.
@@ -705,7 +705,7 @@ module Bunny
705
705
  #
706
706
  # ch = conn.create_channel
707
707
  # q.subscribe do |delivery_info, properties, payload|
708
- # # requeue the message
708
+ # # reject the message
709
709
  # ch.basic_reject(delivery_info.delivery_tag, false)
710
710
  # end
711
711
  #
@@ -1488,7 +1488,7 @@ module Bunny
1488
1488
  #
1489
1489
  # @api plugin
1490
1490
  def recover_from_network_failure
1491
- @logger.debug "Recovering channel #{@id} after network failure"
1491
+ @logger.debug { "Recovering channel #{@id} after network failure" }
1492
1492
  release_all_continuations
1493
1493
 
1494
1494
  recover_prefetch_setting
@@ -1544,7 +1544,7 @@ module Bunny
1544
1544
  # @api plugin
1545
1545
  def recover_queues
1546
1546
  @queues.values.dup.each do |q|
1547
- @logger.debug "Recovering queue #{q.name}"
1547
+ @logger.debug { "Recovering queue #{q.name}" }
1548
1548
  q.recover_from_network_failure
1549
1549
  end
1550
1550
  end
@@ -1555,7 +1555,7 @@ module Bunny
1555
1555
  # @api plugin
1556
1556
  def recover_consumers
1557
1557
  unless @consumers.empty?
1558
- @work_pool = ConsumerWorkPool.new(@work_pool.size)
1558
+ @work_pool = ConsumerWorkPool.new(@work_pool.size, @work_pool.abort_on_exception)
1559
1559
  @work_pool.start
1560
1560
  end
1561
1561
  @consumers.values.dup.each do |c|
@@ -1616,7 +1616,7 @@ module Bunny
1616
1616
 
1617
1617
  # @private
1618
1618
  def handle_method(method)
1619
- @logger.debug "Channel#handle_frame on channel #{@id}: #{method.inspect}"
1619
+ @logger.debug { "Channel#handle_frame on channel #{@id}: #{method.inspect}" }
1620
1620
  case method
1621
1621
  when AMQ::Protocol::Queue::DeclareOk then
1622
1622
  @continuations.push(method)
@@ -15,9 +15,11 @@ module Bunny
15
15
 
16
16
  attr_reader :threads
17
17
  attr_reader :size
18
+ attr_reader :abort_on_exception
18
19
 
19
- def initialize(size = 1)
20
+ def initialize(size = 1, abort_on_exception = false)
20
21
  @size = size
22
+ @abort_on_exception = abort_on_exception
21
23
  @queue = ::Queue.new
22
24
  @paused = false
23
25
  end
@@ -32,6 +34,7 @@ module Bunny
32
34
 
33
35
  @size.times do
34
36
  t = Thread.new(&method(:run_loop))
37
+ t.abort_on_exception = true if abort_on_exception
35
38
  @threads << t
36
39
  end
37
40
 
@@ -69,7 +69,7 @@ module Bunny
69
69
  m = case e
70
70
  when String then
71
71
  e
72
- when Exception then
72
+ when ::Exception then
73
73
  e.message
74
74
  end
75
75
  if hostname && port
@@ -62,7 +62,7 @@ module Bunny
62
62
  now = Time.now
63
63
 
64
64
  if now > (@last_activity_time + @interval)
65
- @logger.debug "Sending a heartbeat, last activity time: #{@last_activity_time}, interval (s): #{@interval}"
65
+ @logger.debug { "Sending a heartbeat, last activity time: #{@last_activity_time}, interval (s): #{@interval}" }
66
66
  @transport.write_without_timeout(AMQ::Protocol::HeartbeatFrame.encode)
67
67
  end
68
68
  end
@@ -86,8 +86,9 @@ module Bunny
86
86
  attr_reader :mechanism
87
87
  # @return [Logger]
88
88
  attr_reader :logger
89
- # @return [Integer] Timeout for blocking protocol operations (queue.declare, queue.bind, etc), in milliseconds. Default is 4000.
89
+ # @return [Integer] Timeout for blocking protocol operations (queue.declare, queue.bind, etc), in milliseconds. Default is 15000.
90
90
  attr_reader :continuation_timeout
91
+ attr_reader :network_recovery_interval
91
92
 
92
93
 
93
94
  # @param [String, Hash] connection_string_or_opts Connection string or a hash of connection options
@@ -107,7 +108,7 @@ module Bunny
107
108
  # @option connection_string_or_opts [String] :tls_key (nil) Path to client TLS/SSL private key file (.pem)
108
109
  # @option connection_string_or_opts [Array<String>] :tls_ca_certificates Array of paths to TLS/SSL CA files (.pem), by default detected from OpenSSL configuration
109
110
  # @option connection_string_or_opts [String] :verify_peer (true) Whether TLS peer verification should be performed
110
- # @option connection_string_or_opts [Integer] :continuation_timeout (4000) Timeout for client operations that expect a response (e.g. {Bunny::Queue#get}), in milliseconds.
111
+ # @option connection_string_or_opts [Integer] :continuation_timeout (15000) Timeout for client operations that expect a response (e.g. {Bunny::Queue#get}), in milliseconds.
111
112
  # @option connection_string_or_opts [Integer] :connection_timeout (5) Timeout in seconds for connecting to the server.
112
113
  # @option connection_string_or_opts [Proc] :hosts_shuffle_strategy A Proc that reorders a list of host strings, defaults to Array#shuffle
113
114
  # @option connection_string_or_opts [Logger] :logger The logger. If missing, one is created using :log_file and :log_level.
@@ -330,14 +331,14 @@ module Bunny
330
331
  # opened (this operation is very fast and inexpensive).
331
332
  #
332
333
  # @return [Bunny::Channel] Newly opened channel
333
- def create_channel(n = nil, consumer_pool_size = 1)
334
+ def create_channel(n = nil, consumer_pool_size = 1, consumer_pool_abort_on_exception = false)
334
335
  raise ArgumentError, "channel number 0 is reserved in the protocol and cannot be used" if 0 == n
335
336
 
336
337
  @channel_mutex.synchronize do
337
338
  if n && (ch = @channels[n])
338
339
  ch
339
340
  else
340
- ch = Bunny::Channel.new(self, n, ConsumerWorkPool.new(consumer_pool_size || 1))
341
+ ch = Bunny::Channel.new(self, n, ConsumerWorkPool.new(consumer_pool_size || 1, consumer_pool_abort_on_exception))
341
342
  ch.open
342
343
  ch
343
344
  end
@@ -547,7 +548,7 @@ module Bunny
547
548
  #
548
549
  # @private
549
550
  def handle_frame(ch_number, method)
550
- @logger.debug "Session#handle_frame on #{ch_number}: #{method.inspect}"
551
+ @logger.debug { "Session#handle_frame on #{ch_number}: #{method.inspect}" }
551
552
  case method
552
553
  when AMQ::Protocol::Channel::OpenOk then
553
554
  @continuations.push(method)
@@ -636,6 +637,7 @@ module Bunny
636
637
  @channels.each do |n, ch|
637
638
  ch.maybe_kill_consumer_work_pool!
638
639
  end
640
+ @reader_loop.stop if @reader_loop
639
641
  maybe_shutdown_heartbeat_sender
640
642
 
641
643
  recover_from_network_failure
@@ -695,9 +697,6 @@ module Bunny
695
697
 
696
698
  # @private
697
699
  def recover_channels
698
- # default channel is reopened right after connection
699
- # negotiation is completed, so make sure we do not try to open
700
- # it twice. MK.
701
700
  @channels.each do |n, ch|
702
701
  ch.open
703
702
 
@@ -934,7 +933,7 @@ module Bunny
934
933
  end
935
934
  end
936
935
 
937
- # Sends multiple frames, one by one. For thread safety this method takes a channel
936
+ # Sends multiple frames, in one go. For thread safety this method takes a channel
938
937
  # object and synchronizes on it.
939
938
  #
940
939
  # @private
@@ -1049,7 +1048,7 @@ module Bunny
1049
1048
  else
1050
1049
  negotiate_value(@client_heartbeat, connection_tune.heartbeat)
1051
1050
  end
1052
- @logger.debug "Heartbeat interval negotiation: client = #{@client_heartbeat}, server = #{connection_tune.heartbeat}, result = #{@heartbeat}"
1051
+ @logger.debug { "Heartbeat interval negotiation: client = #{@client_heartbeat}, server = #{connection_tune.heartbeat}, result = #{@heartbeat}" }
1053
1052
  @logger.info "Heartbeat interval used (in seconds): #{@heartbeat}"
1054
1053
 
1055
1054
  # We set the read_write_timeout to twice the heartbeat value
@@ -1069,9 +1068,9 @@ module Bunny
1069
1068
  end
1070
1069
 
1071
1070
  @transport.send_frame(AMQ::Protocol::Connection::TuneOk.encode(@channel_max, @frame_max, @heartbeat))
1072
- @logger.debug "Sent connection.tune-ok with heartbeat interval = #{@heartbeat}, frame_max = #{@frame_max}, channel_max = #{@channel_max}"
1071
+ @logger.debug { "Sent connection.tune-ok with heartbeat interval = #{@heartbeat}, frame_max = #{@frame_max}, channel_max = #{@channel_max}" }
1073
1072
  @transport.send_frame(AMQ::Protocol::Connection::Open.encode(self.vhost))
1074
- @logger.debug "Sent connection.open with vhost = #{self.vhost}"
1073
+ @logger.debug { "Sent connection.open with vhost = #{self.vhost}" }
1075
1074
 
1076
1075
  frame2 = begin
1077
1076
  fr = @transport.read_next_frame
@@ -458,8 +458,8 @@ but prone man-in-the-middle attacks. Please set :verify_peer => true in producti
458
458
  cert_inlines.push(cert)
459
459
  end
460
460
  end
461
- @logger.debug "Using CA certificates at #{cert_files.join(', ')}"
462
- @logger.debug "Using #{cert_inlines.count} inline CA certificates"
461
+ @logger.debug { "Using CA certificates at #{cert_files.join(', ')}" }
462
+ @logger.debug { "Using #{cert_inlines.count} inline CA certificates" }
463
463
  if certs.empty?
464
464
  @logger.error "No CA certificates found, add one with :tls_ca_certificates"
465
465
  end
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Bunny
4
4
  # @return [String] Version of the library
5
- VERSION = "2.2.2"
5
+ VERSION = "2.3.0"
6
6
  end
@@ -260,7 +260,10 @@ describe Bunny::Queue, "#subscribe" do
260
260
  let(:queue_name) { "bunny.basic_consume#{rand}" }
261
261
 
262
262
  it "uses exception handler" do
263
+ caughts = []
263
264
  t = Thread.new do
265
+ allow(connection.logger).to receive(:error) { |x| caughts << x }
266
+
264
267
  ch = connection.create_channel
265
268
  q = ch.queue(queue_name, :auto_delete => true, :durable => false)
266
269
 
@@ -276,6 +279,8 @@ describe Bunny::Queue, "#subscribe" do
276
279
  5.times { x.publish("hello", :routing_key => queue_name) }
277
280
  sleep 1.5
278
281
 
282
+ expect(caughts.size).to eq(5)
283
+
279
284
  ch.close
280
285
  end
281
286
  end
@@ -359,6 +359,7 @@ unless ENV["CI"]
359
359
  expect(c).not_to be_open
360
360
 
361
361
  wait_for_recovery
362
+ sleep 1
362
363
  expect(ch).to be_open
363
364
 
364
365
  expect(q.consumer_count).to eq n
@@ -381,6 +382,7 @@ unless ENV["CI"]
381
382
  expect(c).not_to be_open
382
383
 
383
384
  wait_for_recovery
385
+ sleep 1
384
386
  expect(ch).to be_open
385
387
 
386
388
  qs.each do |q|
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: 2.2.2
4
+ version: 2.3.0
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: 2015-12-17 00:00:00.000000000 Z
15
+ date: 2016-02-26 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: amq-protocol
@@ -228,7 +228,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
228
228
  version: '0'
229
229
  requirements: []
230
230
  rubyforge_project:
231
- rubygems_version: 2.4.8
231
+ rubygems_version: 2.5.1
232
232
  signing_key:
233
233
  specification_version: 4
234
234
  summary: Popular easy to use Ruby client for RabbitMQ