bunny 1.7.0 → 2.17.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (141) hide show
  1. checksums.yaml +5 -5
  2. data/.github/ISSUE_TEMPLATE.md +18 -0
  3. data/.gitignore +6 -1
  4. data/.rspec +1 -3
  5. data/.travis.yml +21 -14
  6. data/CONTRIBUTING.md +132 -0
  7. data/ChangeLog.md +745 -1
  8. data/Gemfile +13 -13
  9. data/LICENSE +1 -1
  10. data/README.md +41 -75
  11. data/Rakefile +54 -0
  12. data/bunny.gemspec +4 -10
  13. data/docker-compose.yml +28 -0
  14. data/docker/Dockerfile +24 -0
  15. data/docker/apt/preferences.d/erlang +3 -0
  16. data/docker/apt/sources.list.d/bintray.rabbitmq.list +2 -0
  17. data/docker/docker-entrypoint.sh +26 -0
  18. data/docker/rabbitmq.conf +29 -0
  19. data/examples/connection/automatic_recovery_with_basic_get.rb +1 -1
  20. data/examples/connection/automatic_recovery_with_client_named_queues.rb +1 -1
  21. data/examples/connection/automatic_recovery_with_multiple_consumers.rb +1 -1
  22. data/examples/connection/automatic_recovery_with_republishing.rb +1 -1
  23. data/examples/connection/automatic_recovery_with_server_named_queues.rb +1 -1
  24. data/examples/connection/channel_level_exception.rb +1 -9
  25. data/examples/connection/disabled_automatic_recovery.rb +1 -1
  26. data/examples/connection/heartbeat.rb +1 -1
  27. data/examples/consumers/high_and_low_priority.rb +1 -1
  28. data/examples/guides/extensions/alternate_exchange.rb +2 -0
  29. data/examples/guides/getting_started/hello_world.rb +2 -0
  30. data/examples/guides/getting_started/weathr.rb +2 -0
  31. data/examples/guides/queues/one_off_consumer.rb +2 -0
  32. data/examples/guides/queues/redeliveries.rb +2 -0
  33. data/lib/bunny.rb +6 -2
  34. data/lib/bunny/channel.rb +192 -109
  35. data/lib/bunny/channel_id_allocator.rb +6 -4
  36. data/lib/bunny/concurrent/continuation_queue.rb +34 -13
  37. data/lib/bunny/consumer_work_pool.rb +34 -6
  38. data/lib/bunny/cruby/socket.rb +29 -16
  39. data/lib/bunny/cruby/ssl_socket.rb +20 -7
  40. data/lib/bunny/exceptions.rb +7 -1
  41. data/lib/bunny/exchange.rb +11 -7
  42. data/lib/bunny/get_response.rb +1 -1
  43. data/lib/bunny/heartbeat_sender.rb +3 -2
  44. data/lib/bunny/jruby/socket.rb +23 -6
  45. data/lib/bunny/jruby/ssl_socket.rb +5 -0
  46. data/lib/bunny/queue.rb +12 -10
  47. data/lib/bunny/reader_loop.rb +31 -18
  48. data/lib/bunny/session.rb +389 -134
  49. data/lib/bunny/test_kit.rb +14 -0
  50. data/lib/bunny/timeout.rb +1 -12
  51. data/lib/bunny/transport.rb +114 -67
  52. data/lib/bunny/version.rb +1 -1
  53. data/repl +1 -1
  54. data/spec/config/rabbitmq.conf +13 -0
  55. data/spec/higher_level_api/integration/basic_ack_spec.rb +154 -22
  56. data/spec/higher_level_api/integration/basic_cancel_spec.rb +77 -11
  57. data/spec/higher_level_api/integration/basic_consume_spec.rb +60 -55
  58. data/spec/higher_level_api/integration/basic_consume_with_objects_spec.rb +6 -6
  59. data/spec/higher_level_api/integration/basic_get_spec.rb +31 -7
  60. data/spec/higher_level_api/integration/basic_nack_spec.rb +22 -19
  61. data/spec/higher_level_api/integration/basic_publish_spec.rb +11 -100
  62. data/spec/higher_level_api/integration/basic_qos_spec.rb +32 -4
  63. data/spec/higher_level_api/integration/basic_reject_spec.rb +94 -16
  64. data/spec/higher_level_api/integration/basic_return_spec.rb +4 -4
  65. data/spec/higher_level_api/integration/channel_close_spec.rb +51 -10
  66. data/spec/higher_level_api/integration/channel_open_spec.rb +12 -12
  67. data/spec/higher_level_api/integration/connection_recovery_spec.rb +412 -286
  68. data/spec/higher_level_api/integration/connection_spec.rb +284 -134
  69. data/spec/higher_level_api/integration/connection_stop_spec.rb +31 -19
  70. data/spec/higher_level_api/integration/consumer_cancellation_notification_spec.rb +17 -17
  71. data/spec/higher_level_api/integration/dead_lettering_spec.rb +14 -14
  72. data/spec/higher_level_api/integration/exchange_bind_spec.rb +5 -5
  73. data/spec/higher_level_api/integration/exchange_declare_spec.rb +32 -31
  74. data/spec/higher_level_api/integration/exchange_delete_spec.rb +12 -12
  75. data/spec/higher_level_api/integration/exchange_unbind_spec.rb +5 -5
  76. data/spec/higher_level_api/integration/exclusive_queue_spec.rb +5 -5
  77. data/spec/higher_level_api/integration/heartbeat_spec.rb +4 -4
  78. data/spec/higher_level_api/integration/message_properties_access_spec.rb +49 -49
  79. data/spec/higher_level_api/integration/predeclared_exchanges_spec.rb +2 -2
  80. data/spec/higher_level_api/integration/publisher_confirms_spec.rb +92 -27
  81. data/spec/higher_level_api/integration/publishing_edge_cases_spec.rb +19 -19
  82. data/spec/higher_level_api/integration/queue_bind_spec.rb +23 -23
  83. data/spec/higher_level_api/integration/queue_declare_spec.rb +129 -34
  84. data/spec/higher_level_api/integration/queue_delete_spec.rb +2 -2
  85. data/spec/higher_level_api/integration/queue_purge_spec.rb +5 -5
  86. data/spec/higher_level_api/integration/queue_unbind_spec.rb +6 -6
  87. data/spec/higher_level_api/integration/read_only_consumer_spec.rb +9 -9
  88. data/spec/higher_level_api/integration/sender_selected_distribution_spec.rb +10 -10
  89. data/spec/higher_level_api/integration/tls_connection_spec.rb +218 -112
  90. data/spec/higher_level_api/integration/toxiproxy_spec.rb +76 -0
  91. data/spec/higher_level_api/integration/tx_commit_spec.rb +1 -1
  92. data/spec/higher_level_api/integration/tx_rollback_spec.rb +1 -1
  93. data/spec/higher_level_api/integration/with_channel_spec.rb +2 -2
  94. data/spec/issues/issue100_spec.rb +11 -12
  95. data/spec/issues/issue141_spec.rb +13 -14
  96. data/spec/issues/issue202_spec.rb +1 -1
  97. data/spec/issues/issue224_spec.rb +5 -5
  98. data/spec/issues/issue465_spec.rb +32 -0
  99. data/spec/issues/issue549_spec.rb +30 -0
  100. data/spec/issues/issue78_spec.rb +21 -24
  101. data/spec/issues/issue83_spec.rb +5 -6
  102. data/spec/issues/issue97_spec.rb +44 -45
  103. data/spec/lower_level_api/integration/basic_cancel_spec.rb +15 -16
  104. data/spec/lower_level_api/integration/basic_consume_spec.rb +20 -21
  105. data/spec/spec_helper.rb +2 -19
  106. data/spec/stress/channel_close_stress_spec.rb +3 -3
  107. data/spec/stress/channel_open_stress_spec.rb +4 -4
  108. data/spec/stress/channel_open_stress_with_single_threaded_connection_spec.rb +7 -7
  109. data/spec/stress/concurrent_consumers_stress_spec.rb +18 -16
  110. data/spec/stress/concurrent_publishers_stress_spec.rb +16 -19
  111. data/spec/stress/connection_open_close_spec.rb +9 -9
  112. data/spec/stress/merry_go_round_spec.rb +105 -0
  113. data/spec/tls/ca_certificate.pem +27 -16
  114. data/spec/tls/ca_key.pem +52 -27
  115. data/spec/tls/client_certificate.pem +27 -16
  116. data/spec/tls/client_key.pem +49 -25
  117. data/spec/tls/generate-server-cert.sh +8 -0
  118. data/spec/tls/server-openssl.cnf +10 -0
  119. data/spec/tls/server.csr +16 -0
  120. data/spec/tls/server_certificate.pem +27 -16
  121. data/spec/tls/server_key.pem +49 -25
  122. data/spec/toxiproxy_helper.rb +28 -0
  123. data/spec/unit/bunny_spec.rb +5 -5
  124. data/spec/unit/concurrent/atomic_fixnum_spec.rb +6 -6
  125. data/spec/unit/concurrent/condition_spec.rb +8 -8
  126. data/spec/unit/concurrent/linked_continuation_queue_spec.rb +2 -2
  127. data/spec/unit/concurrent/synchronized_sorted_set_spec.rb +16 -16
  128. data/spec/unit/exchange_recovery_spec.rb +39 -0
  129. data/spec/unit/version_delivery_tag_spec.rb +3 -3
  130. metadata +42 -35
  131. data/lib/bunny/system_timer.rb +0 -20
  132. data/spec/config/rabbitmq.config +0 -18
  133. data/spec/higher_level_api/integration/basic_recover_spec.rb +0 -18
  134. data/spec/higher_level_api/integration/confirm_select_spec.rb +0 -19
  135. data/spec/higher_level_api/integration/consistent_hash_exchange_spec.rb +0 -50
  136. data/spec/higher_level_api/integration/merry_go_round_spec.rb +0 -85
  137. data/spec/stress/long_running_consumer_spec.rb +0 -83
  138. data/spec/tls/cacert.pem +0 -18
  139. data/spec/tls/client_cert.pem +0 -18
  140. data/spec/tls/server_cert.pem +0 -18
  141. data/spec/unit/system_timer_spec.rb +0 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: ea321437a2d9950b2f2805e707dda557eef218e7
4
- data.tar.gz: fdffb1a797acfa57566398ca2fdc9c142fbfc675
2
+ SHA256:
3
+ metadata.gz: 3f3ba4a5565a42eace00f8789c1be953871d9dc57d42028a94a9dd70a586271e
4
+ data.tar.gz: c7d2fdf832b466a27c7ae884e6195729d31a6bf1cb6accde9818c2f72b46cdc6
5
5
  SHA512:
6
- metadata.gz: 56cf2d1d7c7eabe6b694760e0bec181969aa33168ccf7f963aa8d6083a3476bcd35595319a4416a3e24f739358395c85fac567dc8a34bb13cdc35bf5c5ec3406
7
- data.tar.gz: 3746761d4ba98aa2eedcd6ba4f4a7d22473349b4b8a84232069dcbbde45e1fddb71906b645a73f87f5b16e0b485822694a076f15ef46ce6d0f7d7750575a306f
6
+ metadata.gz: 26a352492ca652429975e45ec36fad12ebfd3c94e66babb879afb0f09dcec0158affc820f8a29fd07a25d8db6ac9312fd31ebc5b1a3d4c315ecfeeb880a5a8f2
7
+ data.tar.gz: 393fa99fb87c7784eccd0f5019fe3668b39064e15935d85f4134c85aa6b138849d0026addb814f49d00f606b9157b78878863c875d2ad6480b17b3053dcb98fb
@@ -0,0 +1,18 @@
1
+ ## Does This Really Belong to GitHub issues?
2
+
3
+ If you find a bug you understand well, poor default, incorrect or unclear piece of documentation,
4
+ or missing feature, please [file an
5
+ issue](http://github.com/ruby-amqp/bunny/issues) on GitHub.
6
+
7
+ Please use [Bunny's mailing list](http://groups.google.com/group/ruby-amqp) for questions,
8
+ investigations, and discussions. GitHub issues should be used for specific, well understood, actionable
9
+ maintainers and contributors can work on.
10
+
11
+ When filing an issue, please specify
12
+
13
+ * Which Bunny and RabbitMQ versions are used
14
+ * Recent RabbitMQ log file contents
15
+ * Full exception stack traces
16
+ * Steps to reproduce or a failing test case
17
+
18
+ This would greatly help the maintainers help you.
data/.gitignore CHANGED
@@ -11,7 +11,7 @@ Gemfile.lock
11
11
  .tags
12
12
  .tags_sorted_by_file
13
13
  .Apple*
14
- bin/*
14
+ /bin/*
15
15
  .bundle/*
16
16
  vendor/*
17
17
  playground/*
@@ -21,3 +21,8 @@ debug/*
21
21
  *.dump
22
22
  deploy.docs.sh
23
23
  .ruby-version
24
+ .idea
25
+ *.srl
26
+ spec/tls/*.pem
27
+ spec/tls/*.pem~
28
+ spec/tls/*.p12
data/.rspec CHANGED
@@ -1,3 +1 @@
1
- --color
2
- --format
3
- progress
1
+ -c -fp
@@ -1,15 +1,21 @@
1
+ dist: bionic
1
2
  language: ruby
2
3
  bundler_args: --without development
3
- before_script: "./bin/ci/before_build"
4
- script: "bundle exec rspec -cfs spec"
4
+ cache: bundler
5
+ before_install:
6
+ - gem install bundler
7
+ before_script:
8
+ - "./bin/ci/install_on_debian.sh"
9
+ - until sudo lsof -i:5672; do echo "Waiting for RabbitMQ to start..."; sleep 1; done
10
+ - "./bin/ci/before_build.sh"
11
+ script: "bundle exec rake integration_without_recovery"
5
12
  rvm:
6
- - "2.1.0"
7
- - "2.0"
8
- - "1.9.3"
9
- - "jruby"
10
- - "1.9.2"
11
- - "rbx"
12
- - "1.8.7"
13
+ - ruby-head
14
+ - "2.7.1"
15
+ - "2.6.6"
16
+ - "2.5.8"
17
+ - "2.4.10"
18
+ - "2.3.8"
13
19
  notifications:
14
20
  email: michael@rabbitmq.com
15
21
  services:
@@ -17,10 +23,11 @@ services:
17
23
  branches:
18
24
  only:
19
25
  - master
20
- - 1.4.x-stable
26
+ - 2.14.x-stable
27
+ - 2.13.x-stable
28
+ env:
29
+ - CI=true
21
30
  matrix:
22
31
  allow_failures:
23
- - rvm: rbx
24
- - rvm: "1.9.2"
25
- - rvm: "1.8.7"
26
- - rvm: jruby
32
+ rvm:
33
+ - ruby-head
@@ -0,0 +1,132 @@
1
+ ## Overview
2
+
3
+ This project **does not** use GitHub issues for questions, investigations, discussions, and so on.
4
+ Issues are appropriate for something specific enough for a maintainer or contributor to work on:
5
+
6
+ * There should be enough information to reproduce the behavior observed in a reasonable amount of time
7
+ * It should be reasonably clear why the behavior should be changed and why this cannot or should not be addressed
8
+ in application code, a separate library and so on
9
+
10
+ All issues that do not satisfy the above properties belong to the [Ruby RabbitMQ clients mailing list](http://groups.google.com/forum/#!forum/ruby-amqp). Pull request that do not satisfy them have a high chance
11
+ of being closed.
12
+
13
+ ## Submitting a Pull Request
14
+
15
+ Please read the sections below to get an idea about how to run Bunny test suites first. Successfully
16
+ running all tests, at least with `CI` environment variable exported to `true`, is an important
17
+ first step for any contributor.
18
+
19
+ Once you have a passing test suite, create a branch and make your changes on it.
20
+ When you are done with your changes and all
21
+ tests pass, write a [good, detailed commit message](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html) submit a pull request on GitHub.
22
+
23
+ ## Pre-requisites
24
+
25
+ The project uses Bundler for dependency management and requires RabbitMQ `3.5+` to be running
26
+ locally with the `rabbitmq-management` and `rabbitmq_consistent_hash_exchange` plugins enabled.
27
+
28
+ ### Running the Specs
29
+
30
+ The specs require RabbitMQ to be running locally with a specific set of virtual hosts
31
+ and users. RabbitMQ can be provisioned and started any way that's convenient to you
32
+ as long as it has a suitable TLS keys configuration and management plugin enabled.
33
+ Make sure you have a recent version of RabbitMQ (> `3.7.10`).
34
+
35
+ The test suite can either use a locally available RabbitMQ node ([generic binary builds](http://www.rabbitmq.com/install-generic-unix.html)
36
+ are an option that works well) or by running a RabbitMQ server in a Docker container.
37
+
38
+ ### Using a locally installed RabbitMQ node
39
+
40
+ It is possible to start a local RabbitMQ node from the repository root. It is not necessarily
41
+ optimal but can be a good starting point but is a useful example:
42
+
43
+ ```
44
+ RABBITMQ_NODENAME=bunny RABBITMQ_CONFIG_FILE=./spec/config/rabbitmq.conf RABBITMQ_ENABLED_PLUGINS_FILE=./spec/config/enabled_plugins rabbitmq-server
45
+ ```
46
+
47
+ The specs need the RabbitMQ management plugin to be enabled and include TLS connectivity tests,
48
+ so the node must be configured to use a [certificate and key pair](http://www.rabbitmq.com/ssl.html#certificates-and-keys).
49
+ The config and enabled plugin files in the spec/config directory take care of that
50
+ but certificates must be provisioned locally. By default there's a set of CA, server, and client certificates pre-generated at `spec/tls`.
51
+
52
+ The `BUNNY_CERTIFICATE_DIR` environment variable can be used to a directory containing a CA certificate
53
+ and a certificate/key pair to be used by the server. The directory can be generated using
54
+ [tls-gen](https://github.com/michaelklishin/tls-gen)'s basic profile. This option is recommended.
55
+
56
+ `BUNNY_RABBITMQ_HOSTNAME` can be used to override the expected server hostname for [peer verification](http://www.rabbitmq.com/ssl.html#peer-verification) in the TLS test suite:
57
+
58
+ ```
59
+ BUNNY_CERTIFICATE_DIR="/path/to/tls-gen/basic/result" BUNNY_RABBITMQ_HOSTNAME="mayflower" bundle exec rspec
60
+
61
+ ```
62
+
63
+ Certificates can be generated with [tls-gen](https://github.com/michaelklishin/tls-gen)'s basic profile.
64
+ In that case they include a Subject Alternative Name of `localhost` for improved portability.
65
+
66
+
67
+ ### Node Setup
68
+
69
+ There is also a script that preconfigured the node for Bunny tests. It is sufficient to run
70
+ it once but if RabbitMQ is reset it has to be executed again:
71
+
72
+ ```
73
+ RABBITMQ_NODENAME=bunny ./bin/ci/before_build
74
+ ```
75
+
76
+ The script uses `rabbitmqctl` and `rabbitmq-plugins`
77
+ to set up RabbitMQ in a way that Bunny test suites expect. Two environment variables,
78
+ `RABBITMQCTL` and `RABBITMQ_PLUGINS`, are available to control what `rabbitmqctl` and
79
+ `rabbitmq-plugins` commands will be used. By default they are taken from `PATH`
80
+ and prefixed with `sudo`.
81
+
82
+ And then run the core integration suite:
83
+
84
+ ```
85
+ RABBITMQ_NODENAME=bunny CI=true rspec
86
+ ```
87
+
88
+ #### Running a RabbitMQ server in a Docker container
89
+
90
+ First off you have to [install Docker Compose](https://docker.github.io/compose/install/) (and by proxy Docker).
91
+ Version >= 1.6.0+ is required for compose version 2 syntax.
92
+
93
+ After those have been installed (and the `docker-compose` command is available on your command line path), run
94
+
95
+ ```
96
+ docker-compose build && docker-compose run --service-ports rabbitmq
97
+ ```
98
+
99
+ The first time you do this, it will take some time, since it has to download everything it needs
100
+ to build the Docker image.
101
+
102
+ The RabbitMQ server will run in the foreground in the terminal where you started it. You can stop
103
+ it by pressing CTRL+C. If you want to run it in the background, pass `-d` to `docker-compose`.
104
+
105
+ ### Toxiproxy
106
+
107
+ If Toxiproxy is running locally on standard ports or started via Docker:
108
+
109
+ ```
110
+ docker-compose run --service-ports toxiproxy
111
+ ```
112
+
113
+ then Bunny will run additional resiliency tests.
114
+
115
+ ### Running Test Suites
116
+
117
+ Prior to running the tests, configure the RabbitMQ permissions by running `./bin/ci/before_build`
118
+ if you have RabbitMQ locally installed, if you are running RabbitMQ via Docker as above this step
119
+ is not required as the setup is baked in.
120
+
121
+ Make sure you have those two installed and then run integration tests:
122
+
123
+ bundle install
124
+ rake integration
125
+
126
+ It is possible to run all tests:
127
+
128
+ bundle exec rspec
129
+
130
+ It is possible to run only integration and regression tests but exclude unit and stress tests:
131
+
132
+ CI=true bundle exec rspec spec/higher_level_api/ spec/lower_level_api spec/issues spec/higher_level_api/integration/connection_recovery_spec.rb
@@ -1,3 +1,740 @@
1
+ ## Changes between Bunny 2.17.x and 2.18.0 (in development)
2
+
3
+ No changes yet.
4
+
5
+
6
+ ## Changes between Bunny 2.16.x and 2.17.0 (Sep 11th, 2020)
7
+
8
+ ### Easier to Specify a Client-Propvided Connection Name
9
+
10
+ It is now easier to provide a client-provided (custom) connection
11
+ name that will be displayed in the RabbitMQ management UI and mentioned in
12
+ [server logs](https://www.rabbitmq.com/logging.html).
13
+
14
+ Instead of
15
+
16
+ ``` ruby
17
+ conn = Bunny.new(client_properties: {connection_name: 'app ABC #{rand}'})
18
+ conn.start
19
+ ```
20
+
21
+ a new top-level connection option now can be used:
22
+
23
+ ``` ruby
24
+ conn = Bunny.new(connection_name: 'app ABC #{rand}')
25
+ conn.start
26
+ ```
27
+
28
+ Contributed by @brerx.
29
+
30
+ GitHub issue: [ruby-amqp/bunny#600](https://github.com/ruby-amqp/bunny/pull/600)
31
+
32
+
33
+ ## Changes between Bunny 2.15.0 and 2.16.0 (Aug 14th, 2020)
34
+
35
+ ### Asynchronous Exception Delegate
36
+
37
+ Bunny now can delete asynchronous connection (`Bunny::Session`) exception to an arbitrary
38
+ delegate object. Use the `:session_error_handler` connection setting to pass it.
39
+ The value defaults to `Thread.current`.
40
+
41
+ Contributed by @bbascarevic.
42
+
43
+ GitHub issue: [ruby-amqp/bunny#597](https://github.com/ruby-amqp/bunny/issues/597)
44
+
45
+
46
+ ## Changes between Bunny 2.14.0 and 2.15.0 (Apr 8th, 2020)
47
+
48
+ ### More Defensive Thread Join Operations
49
+
50
+ Bunny is now more defensive around thread join operations which it performs
51
+ when stopping its consumer work pool.
52
+
53
+ `Thread#join` can cause an unhandled exception to be re-raised at
54
+ a very surprising moment. This behavior can also be affected by 3rd party
55
+ libraries, e.g. those that do connection pooling. While Bunny cannot
56
+ fully avoid every possible surprising failure, it now avoids at least
57
+ one such problematic interaction triggered by a custom [interrupt handler](https://ruby-doc.org/core-2.5.1/Thread.html#method-c-handle_interrupt)
58
+ in a 3rd party library.
59
+
60
+ GitHub issue: [#589](https://github.com/ruby-amqp/bunny/issues/589)
61
+
62
+ Contributed by @fuegas.
63
+
64
+ ### Dependency Updates
65
+
66
+ `amq-protocol` dependency has been bumped to `2.3.1` to support `connection.update-secret`
67
+ protocol extension.
68
+
69
+ ### Gem Installation Fixed on Windows
70
+
71
+ `bin/ci`, a directory with symlinks, is no longer included into the gem.
72
+
73
+ Contributed by Jack Xiaosong Xu.
74
+
75
+ ### Lazy Peer Certificate Chain Information Logging
76
+
77
+ Peer certificate chain information is now logged lazily, which prevents
78
+ an obscure exception originating ASN.1 parser and makes the logging
79
+ code evaluate only when it is really necessary.
80
+
81
+ GitHub issue: [#578](https://github.com/ruby-amqp/bunny/pull/578)
82
+
83
+ Contributed by Garrett Thornburg.
84
+
85
+
86
+ ## Changes between Bunny 2.13.0 and 2.14.0 (Feb 20th, 2019)
87
+
88
+ ### Improved Peer Verification Failure Logging
89
+
90
+ When [peer verification](https://www.rabbitmq.com/ssl.html#peer-verification) fails, the connection will now log
91
+ some relevant peer certificate chain details. If Bunny
92
+ log level is set to `debug`, the same information will be logged
93
+ unconditionally.
94
+
95
+ ### Closing Connections without Waiting for Response
96
+
97
+ `Bunny::Session#close` now accepts a parameter that controls whether
98
+ it waits for a `connection.close-ok` frame. Not waiting is useful
99
+ when it is known for a fact that the node might not respond
100
+ (it might be shutting down, connection is known to be interrupted
101
+ or unrecoverable and so on) or waiting is irrelevant to the caller.
102
+
103
+ ### Successful Connection Recovery Notification
104
+
105
+ `Bunny::Session#after_recovery_completed` (accepts a block)
106
+ and a new connection option, `:recovery_completed` (a callable object)
107
+ can be used to react to successful connection and topology recovery.
108
+
109
+ GitHub issue: [#573](https://github.com/ruby-amqp/bunny/pull/573).
110
+
111
+ Contributed by Ionut Popa.
112
+
113
+ ### effin_utf8 Dependency Dropped
114
+
115
+ This library no longer supports Ruby 1.8 and thus
116
+ doesn't need to depend on the `effin_utf8` gem.
117
+
118
+ Contributed by Luciano Sousa.
119
+
120
+
121
+ ## Changes between Bunny 2.12.0 and 2.13.0 (Dec 25th, 2018)
122
+
123
+ ### More Defensive `Bunny::Channel` Method(s)
124
+
125
+ `Bunny::Channel#queue` will now throw an `ArgumentError` if a `nil`
126
+ is passed for queue name.
127
+
128
+ GitHub issue: [#570](https://github.com/ruby-amqp/bunny/issues/570)
129
+
130
+ ### Correct Logging of Recovery Attempts Left
131
+
132
+ During connection recovery, if `recover_attempts` is not set (is `nil`)
133
+ connection could produce confusing log messages.
134
+
135
+ GitHub issue: [#569](https://github.com/ruby-amqp/bunny/issues/569)
136
+
137
+
138
+ ## Changes between Bunny 2.11.0 and 2.12.0 (Sep 22nd, 2018)
139
+
140
+ ### More Defensive Treatment of `queue.declare-ok` Responses
141
+
142
+ Responses for `queue.declare` are now checked against a memoized
143
+ queue name (but only if the queue is not server-named). This helps
144
+ avoids scenarios with overlapping/concurrent requests due to high
145
+ network latency as demonstrated in [#558](https://github.com/ruby-amqp/bunny/issues/558).
146
+
147
+ "Mismatched" responses will be ignored: Bunny channel API would throw
148
+ an exception for such declarations and there would be no way to "return to"
149
+ even if a matching response arrived and was matched with one of the pending
150
+ requests in a reasonable period of time.
151
+
152
+ As part of this work a new Toxiproxy-based test suite was introduced
153
+ to Bunny.
154
+
155
+ GitHub issue: [#558](https://github.com/ruby-amqp/bunny/issues/558)
156
+
157
+ Reproduction steps contributed by Brian Morton and Scott Bonebraker.
158
+
159
+ ### I/O Exceptions from Heartbeat Sender are Now Silent
160
+
161
+ Heartbeat sender's purpose is to notify the peer, not so much
162
+ to detect local connectivity failures; those will be detected
163
+ by the I/O loop and transport.
164
+
165
+ For single threaded connection users that prefer to roll their own
166
+ recovery strategies getting exceptions from the heartbeat sender
167
+ was counterproductive and painful to deal with.
168
+
169
+ As part of this work a new Toxiproxy-based test suite was introduced
170
+ to Bunny.
171
+
172
+ GitHub issue: [#559](https://github.com/ruby-amqp/bunny/issues/559)
173
+
174
+ Contributed by Scott Bonebraker.
175
+
176
+ ### Correct Connection State on Connections that Experienced Missed Heartbeat
177
+
178
+ Connections that experienced connection closure did not always correctly transition to the closed state.
179
+ `Bunny::ConnectionClosedError` will now be thrown when an operation is attempted on such
180
+ connections.
181
+
182
+ GitHub issue: [#561](https://github.com/ruby-amqp/bunny/issues/561)
183
+
184
+ Contributed by Scott Bonebraker.
185
+
186
+ ### Connection Recovery Will Fail When Max Retry Attempt Limit is Exceeded
187
+
188
+ GitHub issue: [#549](https://github.com/ruby-amqp/bunny/issues/549)
189
+
190
+ Contributed by Arlandis Word.
191
+
192
+ ### Squashed Warnings
193
+
194
+ Many warnings have been eliminated.
195
+
196
+ GitHub issue: [#563](https://github.com/ruby-amqp/bunny/issues/563)
197
+
198
+ Contributed by @dacto.
199
+
200
+
201
+ ### API Reference Corrections
202
+
203
+ GitHub issue: [#557](https://github.com/ruby-amqp/bunny/pull/557)
204
+
205
+ Contributed by Bruno Costa.
206
+
207
+
208
+ ## Changes between Bunny 2.10.0 and 2.11.0 (Jun 21st, 2018)
209
+
210
+ ### More Reliable System-wide Trusted Certificate Directory Detection
211
+
212
+ Bunny no longer tries to compile a list of trusted CA certificates on its own.
213
+ Instead it uses an OpenSSL API method that makes OpenSSL set the path(s),
214
+ which should cover more platforms and be forward- and backward-compatible.
215
+
216
+ GitHub issue: [#555](https://github.com/ruby-amqp/bunny/issues/555).
217
+
218
+ Contributed by Ana María Martínez Gómez.
219
+
220
+
221
+
222
+ ## Changes between Bunny 2.9.0 and 2.10.0 (Jun 5th, 2018)
223
+
224
+ `2.10.0` is a maintenance release that introduces a couple of
225
+ **minor potentially breaking changes**.
226
+
227
+
228
+ ### Disabling Heartbeats Also Disables TCP Socket Read Timeouts
229
+
230
+ Disabling heartbeats will now disable TCP socket read timeouts.
231
+
232
+ They go hand in hand and users who prefer TCP keepalives via
233
+ kernel configuration previously had to also explicitly configure
234
+ a zero read timeout.
235
+
236
+ GitHub issue: [#551](https://github.com/ruby-amqp/bunny/pull/551).
237
+
238
+ Contributed by Carl Hörberg.
239
+
240
+
241
+ ### `verify_peer: false` Has the Expected Effect Again
242
+
243
+ Make sure `verify_peer: false` has the expected effect again.
244
+
245
+ Default value of connection's `:verify_peer` option to `true` only when
246
+ all of `:verify_ssl`, `:verify_peer`, and `:verify` are `nil`.
247
+
248
+ GitHub issue: [#541](https://github.com/ruby-amqp/bunny/issues/541).
249
+
250
+ Contributed by Howard Ding.
251
+
252
+
253
+ ### Maximum Number of Channels Limited to 2K by Default
254
+
255
+ Default maximum number of channels is limited to 2047 to reduce the probability
256
+ of severe channel leaks. See [rabbitmq/rabbitmq-server#1593](https://github.com/rabbitmq/rabbitmq-server/issues/1593) for details.
257
+
258
+ Applications that want to use more channels per connection can still configure a higher value
259
+ using the `channel_max` setting (for both Bunny and RabbitMQ server).
260
+
261
+ GitHub issue: [#553](https://github.com/ruby-amqp/bunny/pull/553).
262
+
263
+
264
+
265
+ ### Squashed Some Warnings
266
+
267
+ GitHub issue: [#552](https://github.com/ruby-amqp/bunny/pull/552).
268
+
269
+ Contributed by @utilum.
270
+
271
+
272
+
273
+ ### Disabling Heartbeats Disables TCP Socket Read Timeouts
274
+
275
+ Disabling heartbeats will also disable TCP socket read timeouts,
276
+ since the two are effectively interconnected. In this case a mechanism
277
+ such as [TCP keepalives](http://www.rabbitmq.com/heartbeats.html#tcp-keepalives) is assumed to be used.
278
+
279
+ See [RabbitMQ heartbeats guide](http://www.rabbitmq.com/heartbeats.html) for a more
280
+ detailed overview of the options.
281
+
282
+ GH issue: [#519](https://github.com/ruby-amqp/bunny/issues/519).
283
+
284
+ Contributed by Carl Hörberg.
285
+
286
+
287
+ ## Changes between Bunny 2.8.0 and 2.9.0 (Jan 8th, 2018)
288
+
289
+ ### Ruby 2.2 Requirement
290
+
291
+ Bunny now requires Ruby 2.2.
292
+
293
+
294
+ ### Connection Recovery Now Retries on Timeouts
295
+
296
+ Connection recovery now will retry on TCP connection timeouts.
297
+
298
+ GitHub issue: [#537](https://github.com/ruby-amqp/bunny/pull/537).
299
+
300
+
301
+ ### More URI Query Parameters
302
+
303
+ Bunny now supports more URI query parameters plus aliases
304
+ that are identical to those of the server.
305
+
306
+ Contributed by Andrew Babichev.
307
+
308
+ GitHub issue: [#534](https://github.com/ruby-amqp/bunny/pull/534)
309
+
310
+
311
+
312
+ ## Changes between Bunny 2.7.0 and 2.8.0 (Dec 18th, 2018)
313
+
314
+ This release has **minor breaking public API changes**.
315
+
316
+ ### `Bunny::Channel#close` on a Closed Channel Now Raises a Sensible Exception
317
+
318
+ `Bunny::Channel#close` on an already closed channel will now raise a sensible exception.
319
+ If the channel was closed due to a channel-level protocol exception, that exception will
320
+ be mentioned.
321
+
322
+ GitHub issue: [#528](https://github.com/ruby-amqp/bunny/issues/528), see [9df7cb](https://github.com/ruby-amqp/bunny/commit/9df7cb04d9ff12b1af62a11e239fd81e5472c872) for
323
+ details.
324
+
325
+ ### JRuby 9K Compatibility
326
+
327
+ A JRuby 9K compatibility issue was corrected by Marian Posăceanu.
328
+ Note that JRuby users are recommended to use [March Hare](http://rubymarchhare.info/), a JRuby-oriented client, instead
329
+ of Bunny.
330
+
331
+ GitHub issue: [#529](https://github.com/ruby-amqp/bunny/pull/529)
332
+
333
+ ### Connection Exceptions are Logged as Warning with Automatic Recovery
334
+
335
+ When automatic recovery is enabled, connection errors are now logged as warnings
336
+ and not errors.
337
+
338
+ Contributed by Merten Falk.
339
+
340
+ GitHub issue: [#531](https://github.com/ruby-amqp/bunny/pull/531)
341
+
342
+ ### Server Heartbeat Value as a String
343
+
344
+ It is now possible to specify a server-defined heartbeat value as a string (`"server"`), not just
345
+ a symbol. This makes it easier to load settings from YAML files.
346
+
347
+ Contributed by Tyrone Wilson.
348
+
349
+ GitHub issue: [#524](https://github.com/ruby-amqp/bunny/pull/524)
350
+
351
+
352
+ ## Changes between Bunny 2.7.0 and 2.7.1 (Sep 25th, 2017)
353
+
354
+ ### Sensible Socket Read Timeouts When RabbitMQ is Configured to Disabled Heartbeats
355
+
356
+ Bunny now correctly handles scenarios where server is configured
357
+ to disable heartbeats (which is a terrible idea, don't do it!)
358
+
359
+ GitHub issue: [#519](https://github.com/ruby-amqp/bunny/issues/519).
360
+
361
+ ### Bunny::Channel#basic_get Usability
362
+
363
+ `Bunny::Channel#basic_get` invoked with a non-existent queue now
364
+ throws a channel exception instead of a generic operation timeout.
365
+
366
+ GitHub issue: [#518](https://github.com/ruby-amqp/bunny/issues/518).
367
+
368
+ ### Spec Suite Improvements
369
+
370
+ `BUNNY_CERTIFICATE_DIR` environment variable now can be used
371
+ to override local CA and client certificate/key pair directory.
372
+ The directory is expected to be the result directory generated
373
+ by the basic [tls-gen](http://github.com/michaelklishin/tls-gen) profile.
374
+
375
+ TLSv1.0 is no longer used in tests because it's being disabled by default
376
+ by more and more installations as it has known vulnerabilities
377
+ and is no longer considered to be acceptable by several compliance
378
+ standards (e.g. PCI DSS).
379
+
380
+ ### Improved Synchronisation for channel.close Handlers
381
+
382
+ `channel.close` handler will now acquire a lock . This avoids concurrency
383
+ hazards in some rare scenarios when a channel is closed due a protocol
384
+ exception by the server and concurrently opened by user code
385
+ at the same time.
386
+
387
+ ### More Meaningful Error Messages in Bunny::Session#create_channel
388
+
389
+ Sometimes users attempt to open a channel on a connection that
390
+ isn't connected yet because `Bunny::Session#start` was never invoked.
391
+
392
+ `Bunny::Session#create_channel` will now provide a more sensible exception message
393
+ in those cases.
394
+
395
+
396
+ ## Changes between Bunny 2.6.0 and 2.7.0 (May 11th, 2017)
397
+
398
+ ### amq-protocol Update
399
+
400
+ Minimum `amq-protocol` version is now [`2.2.0`](https://github.com/ruby-amqp/amq-protocol/blob/master/ChangeLog.md#changes-between-210-and-220-may-11th-2017) which includes
401
+ a change in [how timestamps are encoded](https://github.com/ruby-amqp/amq-protocol/issues/64).
402
+
403
+
404
+ ### `Bunny::ContinuationQueue#poll` Less Prone to Race Conditions
405
+
406
+ `Bunny::ContinuationQueue#poll` was reworked with feedback from Joseph Wong.
407
+
408
+ GitHub issue: [#462](https://github.com/ruby-amqp/bunny/issues/462)
409
+
410
+
411
+ ### Recovery Attempt Counting Strategy Changed
412
+
413
+ Previous behehavior is not unreasonable but is not what many users and
414
+ even RabbitMQ team members come to expect. Therefore it can be
415
+ considered a bug.
416
+
417
+ Previously a reconnection counter was preserved between successful
418
+ recoveries. This made the integration test that uses server-sent
419
+ connection.close possible.
420
+
421
+ With this change, the counter is reset after successful reconnection
422
+ but there's an option to go back to the original behavior. We also do
423
+ a hell of a lot more logging.
424
+
425
+ GitHub issue: [#408](https://github.com/ruby-amqp/bunny/issues/408)
426
+
427
+
428
+ ### Absolute Windows File Paths are No Longer treated as Inline Certs
429
+
430
+ Contributed by Jared Smartt.
431
+
432
+ GitHub issue: [#492](https://github.com/ruby-amqp/bunny/issues/492).
433
+
434
+
435
+ ### Opening a Channel on an Intentionally Closed Connection Immediately Raises an Exception
436
+
437
+ Contributed by Alessandro Verlato.
438
+
439
+ GitHub issue: [#465](https://github.com/ruby-amqp/bunny/issues/465)
440
+
441
+
442
+ ### Bunny::ConsumerWorkPool#shutdown Terminates Early When It's Safe to Do So
443
+
444
+ `Bunny::ConsumerWorkPool#shutdown(true)` waited for consumer shutdown
445
+ even if the pool wasn't active (there were no consumers on its
446
+ channel).
447
+
448
+ GitHub issue: [#438](https://github.com/ruby-amqp/bunny/issues/438).
449
+
450
+
451
+ ### Retry on new Ruby 2.1+ variations of `EAGAIN`, `EWOULDBLOCK`
452
+
453
+ GitHub issue: [#456](https://github.com/ruby-amqp/bunny/issues/456)
454
+
455
+
456
+ ### Do Not Modify Host Arrays
457
+
458
+ Bunny now can work with frozen host arrays.
459
+
460
+ GitHub issue: [#446](https://github.com/ruby-amqp/bunny/issues/446)
461
+
462
+
463
+
464
+ ## Changes between Bunny 2.5.0 and 2.6.0 (October 15th, 2016)
465
+
466
+ ### Graceful Shutdown of Consumers
467
+
468
+ Consumer work pool will now allow for a grace period before stopping
469
+ pool threads so that delivery processing in progress can have a chance to finish.
470
+
471
+ GitHub issue: [#437](https://github.com/ruby-amqp/bunny/pull/437)
472
+
473
+ Contributed by Stefan Sedich.
474
+
475
+ ### `Bunny::Channel#wait_for_confirms` Now Throws When Used on a Closed Channel
476
+
477
+ GitHub issue: [#428](https://github.com/ruby-amqp/bunny/pull/428)
478
+
479
+ Contributed by Dimitar Dimitrov.
480
+
481
+ ### Race Condition Eliminated in `Bunny::Channel#wait_for_confirms`
482
+
483
+ GitHub issue: [#424](https://github.com/ruby-amqp/bunny/issues/424)
484
+
485
+ Contributed by Dimitar Dimitrov.
486
+
487
+ ### More Defensive Consumer Work Pool
488
+
489
+ `Bunny::ConsumerWorkPool#join` and `Bunny::ConsumerWorkPool#pause`
490
+ no longer fails with a `NoMethodError` on nil when executed
491
+ on a work pool that doesn't have active threads (consumers).
492
+
493
+ This change is largely cosmetic and won't affect the majority
494
+ of of projects in any way.
495
+
496
+
497
+ ## Changes between Bunny 2.4.0 and 2.5.0 (July 20th, 2016)
498
+
499
+ ### Exchange Bindings are Now Correctly Recovered
500
+
501
+ GitHub issue: [#410](https://github.com/ruby-amqp/bunny/issues/410)
502
+
503
+ Contributed by Andrew Bruce.
504
+
505
+
506
+ ### `Bunny::Channel#wait_for_confirms` Awaits While There're Outstanding Unconfirmed Messages
507
+
508
+ GitHub issue: [#424](https://github.com/ruby-amqp/bunny/issues/424)
509
+
510
+ Contributed by Dimitar Dimitrov.
511
+
512
+
513
+ ### Queue Recovery Respects the `:no_declare` Option
514
+
515
+ Queue recovery now respects the `:no_declare` option.
516
+
517
+
518
+ ### `Bunny::Channel#wait_for_confirms` Throws Early
519
+
520
+ `Bunny::Channel#wait_for_confirms` now throws an exception
521
+ early when invoked on a closed channel.
522
+
523
+ GitHub issue: [#428](https://github.com/ruby-amqp/bunny/pull/428).
524
+
525
+ Contributed by Dimitar Dimitrov.
526
+
527
+
528
+
529
+ ## Changes between Bunny 2.3.0 and 2.4.0 (June 11th, 2016)
530
+
531
+ **This release includes minor breaking API changes**.
532
+
533
+ ### Unconfirmed Delivery Tag Set Reset on Network Recovery
534
+
535
+ Channels will now reset their unconfirmed delivery tag set after
536
+ recovery.
537
+
538
+ GitHub issue: [#406](https://github.com/ruby-amqp/bunny/pull/406)
539
+
540
+ Contributed by Bill Ruddock.
541
+
542
+ ### Support (Quoted) IPv6 Addresses in Address Lists
543
+
544
+ GitHub issue: [#383](https://github.com/ruby-amqp/bunny/issues/383).
545
+
546
+ Contributed by Jeremy Heiler.
547
+
548
+ ### Transport#read_fully Doesn't Try to Recover
549
+
550
+ Since transport is replaced by a recovering connection
551
+ anyway, and this produces confusing errors up the stack.
552
+
553
+ GitHub issue: [#359](https://github.com/ruby-amqp/bunny/issues/359)
554
+
555
+ Contributed by Donal McBreen.
556
+
557
+ ### Client-Provided Session `:properties` Merged with Defaults
558
+
559
+ Client-Provided Session `:properties` will now be merged with defaults
560
+ instead of replacing them. This makes it much more convenient to
561
+ override a single key.
562
+
563
+ ### More Predictable RABBITMQ_URL Handling
564
+
565
+ **This is a breaking API change**.
566
+
567
+ `RABBITMQ_URL` no longer will be used if any other
568
+ connection options are provided. This makes it possible
569
+ to use `RABBITMQ_URL` for some connections and options
570
+ for others in a single OS process.
571
+
572
+ GitHub issue: [#403](https://github.com/ruby-amqp/bunny/pull/403)
573
+
574
+ Contributed by Jimmy Petersen.
575
+
576
+
577
+ ## Changes between Bunny 2.2.0 and 2.3.0 (Feb 26th, 2016)
578
+
579
+ ### Thread#abort_on_exception Setting for Consumer Work Pool Threads
580
+
581
+ `Bunny::Session#create_channel` now supports a 3rd argument that,
582
+ when set to `true`, makes consumer work pool threads to have
583
+ `Thread#abort_on_exception` set on them.
584
+
585
+ GH issue: [#382](https://github.com/ruby-amqp/bunny/pull/382)
586
+
587
+ Contributed by Seamus Abshere.
588
+
589
+ ### Explicit Transport Closure on Recovery
590
+
591
+ Bunny now will explicitly close previosly used transport before starting
592
+ connection recovery.
593
+
594
+ GitHub issue: [#377](https://github.com/ruby-amqp/bunny/pull/377).
595
+
596
+ Contributed by bkanhoopla.
597
+
598
+ ### No TLS Socket Double-init
599
+
600
+ Makes sure that TLS sockets are not double-initialized.
601
+
602
+ GH issue: [#345](https://github.com/ruby-amqp/bunny/issues/345).
603
+
604
+ Contributed by Carl Hörberg.
605
+
606
+ ### Lazily Evaluated Debug Log Strings
607
+
608
+ GH issue: [#375](https://github.com/ruby-amqp/bunny/pull/375)
609
+
610
+ Contributed by Omer Katz.
611
+
612
+
613
+
614
+ ## Changes between Bunny 2.1.0 and 2.2.0 (Sep 6th, 2015)
615
+
616
+ ### Add :addresses to connect options
617
+
618
+ Before this the connection options only allowed multiple hosts, an
619
+ address is a combination of a host and a port. This makes it possible to
620
+ specify different hosts with different ports.
621
+
622
+ Contributed by Bart van Zon (Tele2).
623
+
624
+ ### Recover from connection.close by default
625
+
626
+ Bunny will now try to reconnect also when server sent connection.close is
627
+ received, e.g. when a server is restarting (but also when the connection is
628
+ force closed by the server). This is in-line with how many other clients behave.
629
+ The old default was `recover_from_connection_close: false`.
630
+
631
+ Contributed by Carl Hörberg (CloudAMQP).
632
+
633
+
634
+ ## Changes between Bunny 2.0.0 and 2.1.0
635
+
636
+ Bunny 2.1.0 has an **important breaking change**. It is highly
637
+ advised that 2.1.0 is not mixed with earlier versions of Bunny
638
+ in case your applications include **integers in message headers**.
639
+
640
+ ### Integer Value Serialisation in Headers
641
+
642
+ Integer values in headers are now serialised as signed 64-bit integers. Previously
643
+ they were serialised as 32-bit unsigned integers, causing both underflows
644
+ and overflows: incorrect values were observed by consumers.
645
+
646
+ It is highly
647
+ advised that 2.1.0 is not mixed with earlier versions of Bunny
648
+ in case your applications include integers in message headers.
649
+
650
+ If that's not the case, Bunny 2.1 will integeroperate with any earlier version
651
+ starting with 0.9.0 just fine. Popular clients in other languages
652
+ (e.g. Java and .NET) will interoperate with Bunny 2.1.0 without
653
+ issues.
654
+
655
+
656
+ ### Explicit Ruby 2.0 Requirement
657
+
658
+ Bunny now requires Ruby 2.0 in the gemspec.
659
+
660
+ Contributed by Carl Hörberg.
661
+
662
+ ### JRuby Fix
663
+
664
+ Bunny runs again on JRuby. Note that
665
+ JRuby users are strongly advised to use March Hare instead.
666
+
667
+ Contributed by Teodor Pripoae.
668
+
669
+
670
+
671
+ ## Changes between Bunny 1.7.0 and 2.0.0
672
+
673
+ Bunny `2.0` doesn't have any breaking API changes
674
+ but drops Ruby 1.8 and 1.9 (both EOL'ed) support,
675
+ hence the version.
676
+
677
+ ### Minimum Required Ruby Version is 2.0
678
+
679
+ Bunny `2.0` requires Ruby 2.0 or later.
680
+
681
+ ## Non-Blocking Writes
682
+
683
+ Bunny now uses non-blocking socket writes, uses a reduced
684
+ number of writes for message publishing (frames are batched
685
+ into a single write), and handles TCP back pressure from
686
+ RabbitMQ better.
687
+
688
+ Contributed by Irina Bednova and Michael Klishin.
689
+
690
+ ### Reduced Timeout Use
691
+
692
+ `Bunny::ContinuationQueue#poll` no longer relies on Ruby's `Timeout` which has
693
+ numerous issues, including starting a new "interruptor" thread per operation,
694
+ which is far from efficient.
695
+
696
+ Contributed by Joe Eli McIlvain and Carl Hörberg.
697
+
698
+ ### Capped Number of Connection Recovery Attempts
699
+
700
+ `:recovery_attempts` is a new option that limits the number of
701
+ connection recovery attempts performed by Bunny. `nil` means
702
+ "no limit".
703
+
704
+ Contributed by Irina Bednova.
705
+
706
+ ### Bunny::Channel#basic_ack and Related Methods Improvements
707
+
708
+ `Bunny::Channel#basic_ack`, `Bunny::Channel#basic_nack`, and `Bunny::Channel#basic_reject`
709
+ now adjust delivery tags between connection recoveries, as well as have a default value for
710
+ the second argument.
711
+
712
+ Contributed by Wayne Conrad.
713
+
714
+ ### Logger Output Remains Consistent
715
+
716
+ Setting the `@logger.progname` attribute changes the output of the logger.
717
+ This is not expected behaviour when the client provides a custom logger.
718
+ Behaviour remains unchainged when the internally initialized logger is used.
719
+
720
+ Contributed by Justin Carter.
721
+
722
+ ### prefetch_count is Limited to 65535
723
+
724
+ Since `basic.qos`'s `prefetch_count` field is of type `short` in the protocol,
725
+ Bunny must enforce its maximum allowed value to `2^16 - 1` to avoid
726
+ confusing issues due to overflow.
727
+
728
+ ### Per-Consumer and Per-Channel Prefetch
729
+
730
+ Recent RabbitMQ versions support `basic.qos` `global` flag, controlling whether
731
+ `prefetch` applies per-consumer or per-channel. Bunny `Channel#prefetch` now
732
+ allows flag to be set as optional parameter, with the same default behaviour as
733
+ before (per-consumer).
734
+
735
+ Contributed by tiredpixel.
736
+
737
+
1
738
  ## Changes between Bunny 1.6.0 and 1.7.0
2
739
 
3
740
  ### TLS Peer Verification Enabled by Default
@@ -118,6 +855,13 @@ Connection shuffling and robustness improvements.
118
855
 
119
856
  Contributed by Andre Foeken (Nedap).
120
857
 
858
+ ### Default Channel Removed
859
+
860
+ Breaks compatibility with Bunny 0.8.x.
861
+
862
+ `Bunny:Session#default_channel` was removed. Please open channels explicitly now,
863
+ as all the examples in the docs do.
864
+
121
865
 
122
866
  ## Changes between Bunny 1.3.0 and 1.4.0
123
867
 
@@ -531,7 +1275,7 @@ Bunny now will use the following TLS/SSL CA's paths on Linux by default:
531
1275
  and will log a warning if no CA files are available via default paths
532
1276
  or `:tls_ca_certificates`.
533
1277
 
534
- Contributed by Carl Hörberg.
1278
+ Contributed by Carl Hörberg.
535
1279
 
536
1280
  ### Consumers Can Be Re-Registered From Bunny::Consumer#handle_cancellation
537
1281