Repository navigation
3.2.0
Changes between Bunny 3.1.0 and 3.2.0 (Aug 19, 2026)
Modernization for Ruby 3.x
Contributed by @eglitobias.
GitHub issue: #735
amq-protocol Bump to 2.8.0
This version optimizes deserialization of a few frame types,
most benefitting applications that primarily consume messages.
Bug Fixes
Connection Recovery Survives connection.close During Negotiation and Repeated Failures Mid-Recovery
Overlapping (concurrent) connection recovery attempts could leave a client
permanently disconnected, in particular when target node was put into maintenance mode
which closes all client connections before the node is restarted.
Several changes address this scenario:
- Connection recovery now uses a mutex to avoid concurrent attempts
- The connection status is set to
:openand the heartbeat sender is started
only afterconnection.open-okis actually received - A
connection.closereceived during negotiation with automatic recovery
enabled is now raised in the recovery thread and handled by the recovery
retry logic, instead of being delivered to the session error handler - Socket read timeout is now applied early, which means that a disabled
(by maintenance mode) protocol listener would not cause client connections
to linger waiting for a socket event that will never arrive
In addition, a failure to redeclare a single entity during topology recovery no
longer aborts the entire recovery process and will catch transport timeout
exceptions.
Reader Loop No Longer Crashes on a Frameset for an Already Closed Channel
Session#handle_frameset now guards against a missing channel like Session#handle_frame already did.
GitHub issue: #741
Bunny::Consumer Identity Preserved on Recovery
Consumers registered via Queue#subscribe_with or Channel#basic_consume_with
are no longer replaced with a freshly constructed Bunny::Consumer during
automatic connection recovery.
The original instance is restored, so callbacks such as on_cancellation defined
before recovery continue to function.
Contributed by @jollopre.
GitHub issue: #737