2.1 自 2.0 以来的变更
AMQP Client 库
Spring AMQP 现在使用 RabbitMQ 团队提供的 5.4.x 版本 amqp-client 库。该客户端默认配置了自动恢复。参见RabbitMQ 自动连接/拓扑恢复。
从 4.0 版本开始,客户端默认启用自动恢复。虽然与该特性兼容,但 Spring AMQP 有自己的恢复机制,通常并不需要客户端的恢复特性。我们建议禁用 amqp-client 的自动恢复,以避免在 broker 可用但连接尚未恢复时出现 AutoRecoverConnectionNotCurrentlyOpenException。从 1.7.1 版本开始,除非你显式创建自己的 RabbitMQ 连接工厂并提供给 CachingConnectionFactory,否则 Spring AMQP 会禁用它。由 RabbitConnectionFactoryBean 创建的 RabbitMQ ConnectionFactory 实例默认也禁用了该选项。
包变更
某些类已移到不同的包。大多数是内部类,不影响用户应用。两个例外是 ChannelAwareMessageListener 和 RabbitListenerErrorHandler。这两个接口现在位于 org.springframework.amqp.rabbit.listener.api。
Publisher Confirm 变更
启用了 publisher confirm 的 channel,在存在未完成的 confirm 时不会返回给缓存。更多信息参见关联的 Publisher Confirm 与 Return。
Listener 容器工厂改进
现在可以使用 listener 容器工厂创建任意 listener 容器,而不仅是用于 @RabbitListener 注解或 @RabbitListenerEndpointRegistry 的容器。更多信息参见使用容器工厂。
ChannelAwareMessageListener 现在继承自 MessageListener。
Broker 事件监听器
引入了 BrokerEventListener,用于将选定的 broker 事件发布为 ApplicationEvent 实例。更多信息参见Broker 事件监听器。
RabbitAdmin 变更
RabbitAdmin 会发现 Declarables 类型的 Bean(它是 Declarable——Queue、Exchange 和 Binding 对象——的容器),并在 broker 上声明其中包含的对象。不建议用户使用声明 <Collection<Queue>>(及其他)的旧机制,而应改用 Declarables Bean。默认情况下旧机制已禁用。更多信息参见声明 Exchange、Queue 与 Binding 的集合。
AnonymousQueue 实例现在默认将 x-queue-master-locator 设为 client-local,以确保队列创建在应用所连接的节点上。更多信息参见配置 Broker。
RabbitTemplate 变更
现在可以为 RabbitTemplate 配置 noLocalReplyConsumer 选项,以控制 sendAndReceive() 操作中回复 consumer 的 noLocal 标志。更多信息参见请求/回复消息传递。
用于 publisher confirm 的 CorrelationData 现在有一个 ListenableFuture,你可以用它获取确认,而不必使用回调。当启用 return 和 confirm 时,如果提供了关联数据,则其中会填充返回的消息。更多信息参见关联的 Publisher Confirm 与 Return。
现在提供名为 replyTimedOut 的方法,用于通知子类回复已超时,从而进行任何状态清理。更多信息参见回复超时。
当使用带 DirectReplyToMessageListenerContainer(默认)的请求/回复、且在回复投递时出现异常(例如迟到的回复)时,现在可以指定一个 ErrorHandler 来调用。参见 RabbitTemplate 上的 setReplyErrorHandler。(2.0.11 中也已提供。)
消息转换
我们引入了新的 Jackson2XmlMessageConverter,以支持在消息与 XML 格式之间相互转换。更多信息参见Jackson2XmlMessageConverter。
管理 REST API
RabbitManagementTemplate 现在已废弃,建议直接使用 com.rabbitmq.http.client.Client(或 com.rabbitmq.http.client.ReactorNettyClient)。更多信息参见RabbitMQ REST API。
@RabbitListener 变更
listener 容器工厂现在可以配置 RetryTemplate,以及可选地配置发送回复时使用的 RecoveryCallback。更多信息参见启用 Listener 端点注解。
异步 @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。
Listener 容器变更
默认的 ConditionalRejectingErrorHandler 现在在存在 x-death header 时会完全丢弃导致致命错误的消息。更多信息参见异常处理。
立即重新入队
引入了新的 ImmediateRequeueAmqpException,用于通知 listener 容器该消息必须重新入队。要使用此特性,新增了 ImmediateRequeueMessageRecoverer 实现。
更多信息参见消息监听器与异步情形。