2.1 版本相较于 2.0 的变更
AMQP 客户端库
Spring AMQP 现在使用由 RabbitMQ 团队提供的 amqp-client
库的 5.4.x 版本。该客户端默认配置了自动恢复功能。详情请参阅 RabbitMQ 自动连接/拓扑恢复。
从 4.0 版本开始,客户端默认启用了自动恢复功能。虽然 Spring AMQP 兼容此功能,但它有自己的恢复机制,通常不需要客户端的恢复功能。我们建议禁用 amqp-client
的自动恢复功能,以避免在代理可用但连接尚未恢复时出现 AutoRecoverConnectionNotCurrentlyOpenException
异常。从 1.7.1 版本开始,Spring AMQP 默认禁用了该功能,除非你显式创建了自己的 RabbitMQ 连接工厂并将其提供给 CachingConnectionFactory
。由 RabbitConnectionFactoryBean
创建的 RabbitMQ ConnectionFactory
实例也默认禁用了此选项。
包变更
某些类已经移动到不同的包中。大多数是内部类,不会影响用户应用程序。有两个例外是 ChannelAwareMessageListener
和 RabbitListenerErrorHandler
。这些接口现在位于 org.springframework.amqp.rabbit.listener.api
包中。
发布者确认变更
启用了发布者确认的通道在有未完成的确认时不会被返回到缓存中。有关更多信息,请参阅相关的发布者确认和返回。
监听器容器工厂的改进
现在,您可以使用监听器容器工厂来创建任何监听器容器,而不仅仅是那些用于 @RabbitListener
注解或 @RabbitListenerEndpointRegistry
的容器。有关更多信息,请参阅使用容器工厂。
ChannelAwareMessageListener
现在继承自 MessageListener
。
Broker 事件监听器
引入了 BrokerEventListener
以将选定的代理事件发布为 ApplicationEvent
实例。有关更多信息,请参阅 Broker 事件监听器。
RabbitAdmin 变更
RabbitAdmin
会检测类型为 Declarables
的 Bean(Declarables
是 Declarable
的容器,包含 Queue
、Exchange
和 Binding
对象),并在代理上声明这些包含的对象。不建议用户使用旧的声明机制(如 <Collection<Queue>>
等),而应使用 Declarables
Bean。默认情况下,旧的机制已被禁用。更多信息请参阅 声明 Exchanges、Queues 和 Bindings 的集合。
AnonymousQueue
实例现在默认声明为 x-queue-master-locator
设置为 client-local
,以确保队列在应用程序连接的节点上创建。有关更多信息,请参阅 配置 Broker。
RabbitTemplate 变更
你现在可以通过配置 RabbitTemplate
的 noLocalReplyConsumer
选项来控制 sendAndReceive()
操作中回复消费者的 noLocal
标志。更多信息请参阅 请求/回复消息。
用于发布者确认的 CorrelationData
现在有一个 ListenableFuture
,你可以使用它来获取确认信息,而不需要使用回调。当启用了返回和确认功能时,如果提供了相关数据,返回的消息将会填充到相关数据中。更多信息请参见相关的发布者确认和返回。
现在提供了一个名为 replyTimedOut
的方法,用于通知子类回复已超时,以便进行任何状态清理。有关更多信息,请参阅回复超时。
现在,您可以在使用 DirectReplyToMessageListenerContainer
(默认)进行请求/回复时,指定一个 ErrorHandler
,当回复传递过程中发生异常(例如,延迟回复)时调用该处理程序。请参阅 RabbitTemplate
上的 setReplyErrorHandler
方法。(自 2.0.11 版本起支持)。
消息转换
我们引入了一个新的 Jackson2XmlMessageConverter
,以支持将消息转换为 XML 格式以及从 XML 格式转换回消息。更多信息请参见 Jackson2XmlMessageConverter。
管理 REST API
RabbitManagementTemplate
现已弃用,推荐直接使用 com.rabbitmq.http.client.Client
(或 com.rabbitmq.http.client.ReactorNettyClient
)。更多信息请参阅 RabbitMQ REST API。
@RabbitListener
的变化
监听器容器工厂现在可以配置一个 RetryTemplate
,并且可以选择性地配置一个 RecoveryCallback
,用于在发送回复时使用。更多信息请参阅启用监听器端点注解。
异步 @RabbitListener
返回值
@RabbitListener
方法现在可以返回 ListenableFuture<?>
或 Mono<?>
。更多信息请参见 异步 @RabbitListener
返回类型。
连接工厂 Bean 的变更
默认情况下,RabbitConnectionFactoryBean
现在会调用 enableHostnameVerification()
。若要恢复到之前的行为,请将 enableHostnameVerification
属性设置为 false
。
连接工厂更改
CachingConnectionFactory
现在无条件地禁用底层 RabbitMQ ConnectionFactory
的自动恢复功能,即使在构造函数中提供了预配置的实例。虽然已经采取措施使 Spring AMQP 与自动恢复兼容,但在某些极端情况下仍然存在问题。Spring AMQP 自 1.0.0 版本以来就拥有自己的恢复机制,不需要使用客户端提供的恢复功能。虽然在 CachingConnectionFactory
构建后仍可以启用此功能(使用 cachingConnectionFactory.getRabbitConnectionFactory()
.setAutomaticRecoveryEnabled()
),但我们强烈建议您不要这样做。如果您在使用客户端工厂(而不是使用 Spring AMQP 组件)时需要自动恢复连接,我们建议您使用单独的 RabbitMQ ConnectionFactory
。
监听器容器变更
默认的 ConditionalRejectingErrorHandler
现在会完全丢弃那些在存在 x-death
头信息时导致致命错误的消息。更多信息请参阅 异常处理。
立即重新排队
引入了一个新的 ImmediateRequeueAmqpException
来通知监听器容器需要重新排队消息。为了使用这个特性,新增了一个 ImmediateRequeueMessageRecoverer
实现。
更多信息请参见消息监听器和异步情况。