Skip to content

3.2.0

Choose a tag to compare

@michaelklishin michaelklishin released this 27 Aug 03:59
· 24 commits to main since this release
927027f

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 :open and the heartbeat sender is started
    only after connection.open-ok is actually received
  • A connection.close received 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