bunny 1.3.0 → 2.17.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (143) hide show
  1. checksums.yaml +5 -5
  2. data/.github/ISSUE_TEMPLATE.md +18 -0
  3. data/.gitignore +7 -1
  4. data/.rspec +1 -3
  5. data/.travis.yml +21 -14
  6. data/CONTRIBUTING.md +132 -0
  7. data/ChangeLog.md +887 -1
  8. data/Gemfile +13 -13
  9. data/LICENSE +1 -1
  10. data/README.md +46 -60
  11. data/Rakefile +54 -0
  12. data/bunny.gemspec +5 -11
  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/extensions/basic_nack.rb +1 -1
  30. data/examples/guides/extensions/dead_letter_exchange.rb +1 -1
  31. data/examples/guides/getting_started/hello_world.rb +2 -0
  32. data/examples/guides/getting_started/weathr.rb +2 -0
  33. data/examples/guides/queues/one_off_consumer.rb +2 -0
  34. data/examples/guides/queues/redeliveries.rb +4 -2
  35. data/lib/bunny.rb +8 -4
  36. data/lib/bunny/channel.rb +268 -153
  37. data/lib/bunny/channel_id_allocator.rb +6 -4
  38. data/lib/bunny/concurrent/continuation_queue.rb +34 -13
  39. data/lib/bunny/consumer_work_pool.rb +34 -6
  40. data/lib/bunny/cruby/socket.rb +48 -21
  41. data/lib/bunny/cruby/ssl_socket.rb +65 -4
  42. data/lib/bunny/exceptions.rb +25 -4
  43. data/lib/bunny/exchange.rb +24 -28
  44. data/lib/bunny/get_response.rb +1 -1
  45. data/lib/bunny/heartbeat_sender.rb +3 -2
  46. data/lib/bunny/jruby/socket.rb +23 -6
  47. data/lib/bunny/jruby/ssl_socket.rb +5 -0
  48. data/lib/bunny/queue.rb +31 -22
  49. data/lib/bunny/reader_loop.rb +31 -18
  50. data/lib/bunny/session.rb +448 -159
  51. data/lib/bunny/test_kit.rb +14 -0
  52. data/lib/bunny/timeout.rb +1 -12
  53. data/lib/bunny/transport.rb +205 -98
  54. data/lib/bunny/version.rb +1 -1
  55. data/repl +1 -1
  56. data/spec/config/enabled_plugins +1 -0
  57. data/spec/config/rabbitmq.conf +13 -0
  58. data/spec/higher_level_api/integration/basic_ack_spec.rb +175 -16
  59. data/spec/higher_level_api/integration/basic_cancel_spec.rb +77 -11
  60. data/spec/higher_level_api/integration/basic_consume_spec.rb +60 -55
  61. data/spec/higher_level_api/integration/basic_consume_with_objects_spec.rb +6 -6
  62. data/spec/higher_level_api/integration/basic_get_spec.rb +31 -7
  63. data/spec/higher_level_api/integration/basic_nack_spec.rb +22 -19
  64. data/spec/higher_level_api/integration/basic_publish_spec.rb +11 -100
  65. data/spec/higher_level_api/integration/basic_qos_spec.rb +32 -4
  66. data/spec/higher_level_api/integration/basic_reject_spec.rb +94 -16
  67. data/spec/higher_level_api/integration/basic_return_spec.rb +4 -4
  68. data/spec/higher_level_api/integration/channel_close_spec.rb +51 -10
  69. data/spec/higher_level_api/integration/channel_open_spec.rb +12 -12
  70. data/spec/higher_level_api/integration/connection_recovery_spec.rb +424 -221
  71. data/spec/higher_level_api/integration/connection_spec.rb +300 -126
  72. data/spec/higher_level_api/integration/connection_stop_spec.rb +31 -19
  73. data/spec/higher_level_api/integration/consumer_cancellation_notification_spec.rb +17 -17
  74. data/spec/higher_level_api/integration/dead_lettering_spec.rb +34 -11
  75. data/spec/higher_level_api/integration/exchange_bind_spec.rb +5 -5
  76. data/spec/higher_level_api/integration/exchange_declare_spec.rb +32 -31
  77. data/spec/higher_level_api/integration/exchange_delete_spec.rb +12 -12
  78. data/spec/higher_level_api/integration/exchange_unbind_spec.rb +5 -5
  79. data/spec/higher_level_api/integration/exclusive_queue_spec.rb +5 -5
  80. data/spec/higher_level_api/integration/heartbeat_spec.rb +26 -8
  81. data/spec/higher_level_api/integration/message_properties_access_spec.rb +49 -49
  82. data/spec/higher_level_api/integration/predeclared_exchanges_spec.rb +2 -2
  83. data/spec/higher_level_api/integration/publisher_confirms_spec.rb +156 -42
  84. data/spec/higher_level_api/integration/publishing_edge_cases_spec.rb +19 -19
  85. data/spec/higher_level_api/integration/queue_bind_spec.rb +23 -23
  86. data/spec/higher_level_api/integration/queue_declare_spec.rb +129 -34
  87. data/spec/higher_level_api/integration/queue_delete_spec.rb +2 -2
  88. data/spec/higher_level_api/integration/queue_purge_spec.rb +5 -5
  89. data/spec/higher_level_api/integration/queue_unbind_spec.rb +6 -6
  90. data/spec/higher_level_api/integration/read_only_consumer_spec.rb +9 -9
  91. data/spec/higher_level_api/integration/sender_selected_distribution_spec.rb +10 -10
  92. data/spec/higher_level_api/integration/tls_connection_spec.rb +224 -89
  93. data/spec/higher_level_api/integration/toxiproxy_spec.rb +76 -0
  94. data/spec/higher_level_api/integration/tx_commit_spec.rb +1 -1
  95. data/spec/higher_level_api/integration/tx_rollback_spec.rb +1 -1
  96. data/spec/higher_level_api/integration/with_channel_spec.rb +2 -2
  97. data/spec/issues/issue100_spec.rb +11 -11
  98. data/spec/issues/issue141_spec.rb +13 -14
  99. data/spec/issues/issue202_spec.rb +1 -1
  100. data/spec/issues/issue224_spec.rb +40 -0
  101. data/spec/issues/issue465_spec.rb +32 -0
  102. data/spec/issues/issue549_spec.rb +30 -0
  103. data/spec/issues/issue78_spec.rb +21 -24
  104. data/spec/issues/issue83_spec.rb +5 -6
  105. data/spec/issues/issue97_spec.rb +44 -45
  106. data/spec/lower_level_api/integration/basic_cancel_spec.rb +15 -16
  107. data/spec/lower_level_api/integration/basic_consume_spec.rb +20 -21
  108. data/spec/spec_helper.rb +8 -26
  109. data/spec/stress/channel_close_stress_spec.rb +64 -0
  110. data/spec/stress/channel_open_stress_spec.rb +15 -9
  111. data/spec/stress/channel_open_stress_with_single_threaded_connection_spec.rb +7 -7
  112. data/spec/stress/concurrent_consumers_stress_spec.rb +18 -16
  113. data/spec/stress/concurrent_publishers_stress_spec.rb +16 -19
  114. data/spec/stress/connection_open_close_spec.rb +9 -9
  115. data/spec/stress/merry_go_round_spec.rb +105 -0
  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_key.pem +49 -25
  121. data/spec/toxiproxy_helper.rb +28 -0
  122. data/spec/unit/bunny_spec.rb +5 -5
  123. data/spec/unit/concurrent/atomic_fixnum_spec.rb +6 -6
  124. data/spec/unit/concurrent/condition_spec.rb +8 -8
  125. data/spec/unit/concurrent/linked_continuation_queue_spec.rb +2 -2
  126. data/spec/unit/concurrent/synchronized_sorted_set_spec.rb +16 -16
  127. data/spec/unit/exchange_recovery_spec.rb +39 -0
  128. data/spec/unit/version_delivery_tag_spec.rb +3 -3
  129. metadata +65 -47
  130. data/.ruby-version +0 -1
  131. data/lib/bunny/compatibility.rb +0 -24
  132. data/lib/bunny/system_timer.rb +0 -20
  133. data/spec/compatibility/queue_declare_spec.rb +0 -44
  134. data/spec/compatibility/queue_declare_with_default_channel_spec.rb +0 -33
  135. data/spec/higher_level_api/integration/basic_recover_spec.rb +0 -18
  136. data/spec/higher_level_api/integration/confirm_select_spec.rb +0 -19
  137. data/spec/higher_level_api/integration/consistent_hash_exchange_spec.rb +0 -50
  138. data/spec/higher_level_api/integration/merry_go_round_spec.rb +0 -85
  139. data/spec/stress/long_running_consumer_spec.rb +0 -83
  140. data/spec/tls/cacert.pem +0 -18
  141. data/spec/tls/client_cert.pem +0 -18
  142. data/spec/tls/server_cert.pem +0 -18
  143. data/spec/unit/system_timer_spec.rb +0 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 972f0f0055bbc831144da54e6805c4d5f5e2262c
4
- data.tar.gz: ad2f3539fb6946771238e6451b17d33cfdba692b
2
+ SHA256:
3
+ metadata.gz: 3f3ba4a5565a42eace00f8789c1be953871d9dc57d42028a94a9dd70a586271e
4
+ data.tar.gz: c7d2fdf832b466a27c7ae884e6195729d31a6bf1cb6accde9818c2f72b46cdc6
5
5
  SHA512:
6
- metadata.gz: ad93a02f5623437589eb2027259de36a2269df8ab06d251b00e6b28b265f8f562068a1c7e473b2513eff18bdde77902b46a24c114a9a1c9dbe29426c93f67085
7
- data.tar.gz: da94e1d8349674cf2819678f2fb18a1fd911017fb7c99104d64d755c9d7f9622068db60a5502411c6442d04fe341372d09d31c6e5885c0cda18293ea04db3e81
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/*
@@ -20,3 +20,9 @@ repl-*
20
20
  debug/*
21
21
  *.dump
22
22
  deploy.docs.sh
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
data/.travis.yml CHANGED
@@ -1,15 +1,21 @@
1
+ dist: bionic
1
2
  language: ruby
2
3
  bundler_args: --without development
3
- before_script: "./bin/ci/before_build.sh"
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.1.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
data/CONTRIBUTING.md ADDED
@@ -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
data/ChangeLog.md CHANGED
@@ -1,3 +1,889 @@
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
+
738
+ ## Changes between Bunny 1.6.0 and 1.7.0
739
+
740
+ ### TLS Peer Verification Enabled by Default
741
+
742
+ When using TLS, peer verification is now enabled by default.
743
+ It is still possible to [disable verification](http://rubybunny.info/articles/tls.html), e.g. for convenient
744
+ development locally.
745
+
746
+ Peer verification is a means of protection against man-in-the-middle attacks
747
+ and is highly recommended in production settings. However, it can be an inconvenience
748
+ during local development. We believe it's time to have the default to be
749
+ more secure.
750
+
751
+ Contributed by Michael Klishin (Pivotal) and Andre Foeken (Nedap).
752
+
753
+
754
+ ### Higher Default Connection Timeout
755
+
756
+ Default connection timeout has been increased to 25 seconds. The older
757
+ default of 5 seconds wasn't sufficient in some edge cases with DNS
758
+ resolution (e.g. when primary DNS server is down).
759
+
760
+ The value can be overriden at connection time.
761
+
762
+ Contributed by Yury Batenko.
763
+
764
+
765
+ ### Socket Read Timeout No Longer Set to 0 With Disabled Heartbeats
766
+
767
+ GH issue: [#267](https://github.com/ruby-amqp/bunny/pull/267).
768
+
769
+
770
+ ### JRuby Writes Fixes
771
+
772
+ On JRuby, Bunny reverts back to using plain old `write(2)` for writes. The CRuby implementation
773
+ on JRuby suffers from I/O incompatibilities. Until JRuby
774
+
775
+ Bunny users who run on JRuby are highly recommended to switch to [March Hare](http://rubymarchhare.info),
776
+ which has nearly identical API and is significantly more efficient.
777
+
778
+
779
+ ### Bunny::Session#with_channel Synchornisation Improvements
780
+
781
+ `Bunny::Session#with_channel` is now fully synchronised and won't run into `COMMAND_INVALID` errors
782
+ when used from multiple threads that share a connection.
783
+
784
+
785
+
786
+ ## Changes between Bunny 1.5.0 and 1.6.0
787
+
788
+ ### TLSv1 by Default
789
+
790
+ TLS connections now prefer TLSv1 (or later, if available) due to the recently discovered
791
+ [POODLE attack](https://www.openssl.org/~bodo/ssl-poodle.pdf) on SSLv3.
792
+
793
+ Contributed by Michael Klishin (Pivotal) and Justin Powers (Desk.com).
794
+
795
+ GH issues:
796
+
797
+ * [#259](https://github.com/ruby-amqp/bunny/pull/259)
798
+ * [#260](https://github.com/ruby-amqp/bunny/pull/260)
799
+ * [#261](https://github.com/ruby-amqp/bunny/pull/261)
800
+
801
+
802
+ ### Socket Read and Write Timeout Improvements
803
+
804
+ Bunny now sets a read timeout on the sockets it opens, and uses
805
+ `IO.select` timeouts as the most reliable option available
806
+ on Ruby 1.9 and later.
807
+
808
+ GH issue: [#254](https://github.com/ruby-amqp/bunny/pull/254).
809
+
810
+ Contributed by Andre Foeken (Nedap).
811
+
812
+ ### Inline TLS Certificates Support
813
+
814
+ TLS certificate options now accept inline certificates as well as
815
+ file paths.
816
+
817
+ GH issues: [#255](https://github.com/ruby-amqp/bunny/pull/255), [#256](https://github.com/ruby-amqp/bunny/pull/256).
818
+
819
+ Contributed by Will Barrett (Sqwiggle).
820
+
821
+
822
+ ## Changes between Bunny 1.4.0 and 1.5.0
823
+
824
+ ### Improved Uncaught Exception Handler
825
+
826
+ Uncaught exception handler now provides more information about the exception,
827
+ including its caller (one more stack trace line).
828
+
829
+ Contributed by Carl Hörberg (CloudAMQP).
830
+
831
+
832
+ ### Convenience Method for Temporary (Server-named, Exclusive) Queue Declaration
833
+
834
+ `Bunny::Channel#temporary_queue` is a convenience method that declares a new
835
+ server-named exclusive queue:
836
+
837
+ ``` ruby
838
+ q = ch.temporary_queue
839
+ ```
840
+
841
+ Contributed by Daniel Schierbeck (Zendesk).
842
+
843
+ ### Recovery Reliability Improvements
844
+
845
+ Automatic connection recovery robustness improvements.
846
+ Contributed by Andre Foeken (Nedap).
847
+
848
+ ### Host Lists
849
+
850
+ It is now possible to pass the `:hosts` option to `Bunny.new`/`Bunny::Session#initialize`.
851
+ When connection to RabbitMQ (including during connection recovery), a random host
852
+ will be chosen from the list.
853
+
854
+ Connection shuffling and robustness improvements.
855
+
856
+ Contributed by Andre Foeken (Nedap).
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
+
865
+
866
+ ## Changes between Bunny 1.3.0 and 1.4.0
867
+
868
+ ### Channel#wait_for_confirms Returns Immediately If All Publishes Confirmed
869
+
870
+ Contributed by Matt Campbell.
871
+
872
+ ### Publisher Confirms is In Sync After Recovery
873
+
874
+ When a connection is recovered, the sequence counter resets on the
875
+ broker, but not the client. To keep things in sync the client must store a confirmation
876
+ offset after a recovery.
877
+
878
+ Contributed by Devin Christensen.
879
+
880
+ ### NoMethodError on Thread During Shutdown
881
+
882
+ During abnormal termination, `Bunny::Session#close` no longer tries
883
+ to call the non-existent `terminate_with` method on its origin
884
+ thread.
885
+
886
+
1
887
  ## Changes between Bunny 1.2.0 and 1.3.0
2
888
 
3
889
  ### TLS Can Be Explicitly Disabled
@@ -389,7 +1275,7 @@ Bunny now will use the following TLS/SSL CA's paths on Linux by default:
389
1275
  and will log a warning if no CA files are available via default paths
390
1276
  or `:tls_ca_certificates`.
391
1277
 
392
- Contributed by Carl Hörberg.
1278
+ Contributed by Carl Hörberg.
393
1279
 
394
1280
  ### Consumers Can Be Re-Registered From Bunny::Consumer#handle_cancellation
395
1281