For the latest stable version, please use Spring AMQP 3.2.1!

Changes in 2.2 Since 2.1

This section describes the changes between version 2.1 and version 2.2.

Package Changes

The following classes/interfaces have been moved from org.springframework.amqp.rabbit.core.support to org.springframework.amqp.rabbit.batch:

  • BatchingStrategy

  • MessageBatch

  • SimpleBatchingStrategy

In addition, ListenerExecutionFailedException has been moved from org.springframework.amqp.rabbit.listener.exception to org.springframework.amqp.rabbit.support.

Dependency Changes

JUnit (4) is now an optional dependency and will no longer appear as a transitive dependency.

The spring-rabbit-junit module is now a compile dependency in the spring-rabbit-test module for a better target application development experience when with only a single spring-rabbit-test we get the full stack of testing utilities for AMQP components.

[[-breaking-api-changes]] == "Breaking" API Changes

the JUnit (5) RabbitAvailableCondition.getBrokerRunning() now returns a BrokerRunningSupport instance instead of a BrokerRunning, which depends on JUnit 4. It has the same API so it’s just a matter of changing the class name of any references. See JUnit5 Conditions for more information.

ListenerContainer Changes

Messages with fatal exceptions are now rejected and NOT requeued, by default, even if the acknowledge mode is manual. See Exception Handling for more information.

Listener performance can now be monitored using Micrometer Timer s. See Monitoring Listener Performance for more information.

@RabbitListener Changes

You can now configure an executor on each listener, overriding the factory configuration, to more easily identify threads associated with the listener. You can now override the container factory’s acknowledgeMode property with the annotation’s ackMode property. See overriding container factory properties for more information.

When using batching, @RabbitListener methods can now receive a complete batch of messages in one call instead of getting them one-at-a-time.

When receiving batched messages one-at-a-time, the last message has the isLastInBatch message property set to true.

In addition, received batched messages now contain the amqp_batchSize header.

Listeners can also consume batches created in the SimpleMessageListenerContainer, even if the batch is not created by the producer. See Choosing a Container for more information.

Spring Data Projection interfaces are now supported by the Jackson2JsonMessageConverter. See Using Spring Data Projection Interfaces for more information.

The Jackson2JsonMessageConverter now assumes the content is JSON if there is no contentType property, or it is the default (application/octet-string). See Converting from a Message for more information.

Similarly. the Jackson2XmlMessageConverter now assumes the content is XML if there is no contentType property, or it is the default (application/octet-string). See Jackson2XmlMessageConverter for more information.

When a @RabbitListener method returns a result, the bean and Method are now available in the reply message properties. This allows configuration of a beforeSendReplyMessagePostProcessor to, for example, set a header in the reply to indicate which method was invoked on the server. See Reply Management for more information.

You can now configure a ReplyPostProcessor to make modifications to a reply message before it is sent. See Reply Management for more information.

AMQP Logging Appenders Changes

The Log4J and Logback AmqpAppender s now support a verifyHostname SSL option.

Also these appenders now can be configured to not add MDC entries as headers. The addMdcAsHeaders boolean option has been introduces to configure such a behavior.

The appenders now support the SaslConfig property.

See Logging Subsystem AMQP Appenders for more information.

MessageListenerAdapter Changes

The MessageListenerAdapter provides now a new buildListenerArguments(Object, Channel, Message) method to build an array of arguments to be passed into target listener and an old one is deprecated. See MessageListenerAdapter for more information.

[[exchange/queue-declaration-changes]] == Exchange/Queue Declaration Changes

The ExchangeBuilder and QueueBuilder fluent APIs used to create Exchange and Queue objects for declaration by RabbitAdmin now support "well known" arguments. See Builder API for Queues and Exchanges for more information.

The RabbitAdmin has a new property explicitDeclarationsOnly. See Conditional Declaration for more information.

Connection Factory Changes

The CachingConnectionFactory has a new property shuffleAddresses. When providing a list of broker node addresses, the list will be shuffled before creating a connection so that the order in which the connections are attempted is random. See Connecting to a Cluster for more information.

When using Publisher confirms and returns, the callbacks are now invoked on the connection factory’s executor. This avoids a possible deadlock in the amqp-clients library if you perform rabbit operations from within the callback. See Correlated Publisher Confirms and Returns for more information.

Also, the publisher confirm type is now specified with the ConfirmType enum instead of the two mutually exclusive setter methods.

The RabbitConnectionFactoryBean now uses TLS 1.2 by default when SSL is enabled. See RabbitConnectionFactoryBean and Configuring SSL for more information.

New MessagePostProcessor Classes

Classes DeflaterPostProcessor and InflaterPostProcessor were added to support compression and decompression, respectively, when the message content-encoding is set to deflate.

Other Changes

The Declarables object (for declaring multiple queues, exchanges, bindings) now has a filtered getter for each type. See Declaring Collections of Exchanges, Queues, and Bindings for more information.

You can now customize each Declarable bean before the RabbitAdmin processes the declaration thereof. See Automatic Declaration of Exchanges, Queues, and Bindings for more information.

singleActiveConsumer() has been added to the QueueBuilder to set the x-single-active-consumer queue argument. See Builder API for Queues and Exchanges for more information.

Outbound headers with values of type Class<?> are now mapped using getName() instead of toString(). See Message Properties Converters for more information.

Recovery of failed producer-created batches is now supported. See Retry with Batch Listeners for more information.