This version is still in development and is not considered stable yet. For the latest stable version, please use Spring AMQP 3.2.1! |
Changes in 2.1 Since 2.0
AMQP Client library
Spring AMQP now uses the 5.4.x version of the amqp-client
library provided by the RabbitMQ team.
This client has auto-recovery configured by default.
See RabbitMQ Automatic Connection/Topology recovery.
As of version 4.0, the client enables automatic recovery by default.
While compatible with this feature, Spring AMQP has its own recovery mechanisms and the client recovery feature generally is not needed.
We recommend disabling amqp-client automatic recovery, to avoid getting AutoRecoverConnectionNotCurrentlyOpenException instances when the broker is available but the connection has not yet recovered.
Starting with version 1.7.1, Spring AMQP disables it unless you explicitly create your own RabbitMQ connection factory and provide it to the CachingConnectionFactory .
RabbitMQ ConnectionFactory instances created by the RabbitConnectionFactoryBean also have the option disabled by default.
|
Package Changes
Certain classes have moved to different packages.
Most are internal classes and do not affect user applications.
Two exceptions are ChannelAwareMessageListener
and RabbitListenerErrorHandler
.
These interfaces are now in org.springframework.amqp.rabbit.listener.api
.
Publisher Confirms Changes
Channels enabled for publisher confirmations are not returned to the cache while there are outstanding confirmations. See Correlated Publisher Confirms and Returns for more information.
Listener Container Factory Improvements
You can now use the listener container factories to create any listener container, not only those for use with @RabbitListener
annotations or the @RabbitListenerEndpointRegistry
.
See Using Container Factories for more information.
ChannelAwareMessageListener
now inherits from MessageListener
.
Broker Event Listener
A BrokerEventListener
is introduced to publish selected broker events as ApplicationEvent
instances.
See Broker Event Listener for more information.
RabbitAdmin Changes
The RabbitAdmin
discovers beans of type Declarables
(which is a container for Declarable
- Queue
, Exchange
, and Binding
objects) and declare the contained objects on the broker.
Users are discouraged from using the old mechanism of declaring <Collection<Queue>>
(and others) and should use Declarables
beans instead.
By default, the old mechanism is disabled.
See Declaring Collections of Exchanges, Queues, and Bindings for more information.
AnonymousQueue
instances are now declared with x-queue-master-locator
set to client-local
by default, to ensure the queues are created on the node the application is connected to.
See Configuring the Broker for more information.
RabbitTemplate Changes
You can now configure the RabbitTemplate
with the noLocalReplyConsumer
option to control a noLocal
flag for reply consumers in the sendAndReceive()
operations.
See Request/Reply Messaging for more information.
CorrelationData
for publisher confirmations now has a ListenableFuture
, which you can use to get the acknowledgment instead of using a callback.
When returns and confirmations are enabled, the correlation data, if provided, is populated with the returned message.
See Correlated Publisher Confirms and Returns for more information.
A method called replyTimedOut
is now provided to notify subclasses that a reply has timed out, allowing for any state cleanup.
See Reply Timeout for more information.
You can now specify an ErrorHandler
to be invoked when using request/reply with a DirectReplyToMessageListenerContainer
(the default) when exceptions occur when replies are delivered (for example, late replies).
See setReplyErrorHandler
on the RabbitTemplate
.
(Also since 2.0.11).
Message Conversion
We introduced a new Jackson2XmlMessageConverter
to support converting messages from and to XML format.
See Jackson2XmlMessageConverter
for more information.
Management REST API
The RabbitManagementTemplate
is now deprecated in favor of the direct com.rabbitmq.http.client.Client
(or com.rabbitmq.http.client.ReactorNettyClient
) usage.
See RabbitMQ REST API for more information.
@RabbitListener
Changes
The listener container factory can now be configured with a RetryTemplate
and, optionally, a RecoveryCallback
used when sending replies.
See Enable Listener Endpoint Annotations for more information.
Async @RabbitListener
Return
@RabbitListener
methods can now return ListenableFuture<?>
or Mono<?>
.
See Asynchronous @RabbitListener
Return Types for more information.
Connection Factory Bean Changes
By default, the RabbitConnectionFactoryBean
now calls enableHostnameVerification()
.
To revert to the previous behavior, set the enableHostnameVerification
property to false
.
Connection Factory Changes
The CachingConnectionFactory
now unconditionally disables auto-recovery in the underlying RabbitMQ ConnectionFactory
, even if a pre-configured instance is provided in a constructor.
While steps have been taken to make Spring AMQP compatible with auto recovery, certain corner cases have arisen where issues remain.
Spring AMQP has had its own recovery mechanism since 1.0.0 and does not need to use the recovery provided by the client.
While it is still possible to enable the feature (using cachingConnectionFactory.getRabbitConnectionFactory()
.setAutomaticRecoveryEnabled()
) after the CachingConnectionFactory
is constructed, we strongly recommend that you not do so.
We recommend that you use a separate RabbitMQ ConnectionFactory
if you need auto recovery connections when using the client factory directly (rather than using Spring AMQP components).
Listener Container Changes
The default ConditionalRejectingErrorHandler
now completely discards messages that cause fatal errors if an x-death
header is present.
See Exception Handling for more information.
Immediate requeue
A new ImmediateRequeueAmqpException
is introduced to notify a listener container that the message has to be re-queued.
To use this feature, a new ImmediateRequeueMessageRecoverer
implementation is added.
See Message Listeners and the Asynchronous Case for more information.