2.0 相较于 1.7 的变更

使用 CachingConnectionFactory

从 2.0.2 版本开始,您可以配置 RabbitTemplate 以使用与监听器容器使用的连接不同的连接。此更改避免了在生产者因任何原因阻塞时消费者发生死锁的情况。有关更多信息,请参阅 使用单独的连接

AMQP 客户端库

Spring AMQP 现在使用 RabbitMQ 团队提供的 amqp-client 库的新 5.0.x 版本。此客户端默认配置了自动恢复功能。请参阅 RabbitMQ 自动连接/拓扑恢复

从 4.0 版本开始,客户端默认启用自动恢复功能。虽然与此功能兼容,但 Spring AMQP 拥有自己的恢复机制,并且通常不需要客户端恢复功能。我们建议您禁用 amqp-client 自动恢复功能,以避免在代理可用但连接尚未恢复时出现 AutoRecoverConnectionNotCurrentlyOpenException 实例。从 1.7.1 版本开始,Spring AMQP 禁用了它,除非您明确创建自己的 RabbitMQ 连接工厂并将其提供给 CachingConnectionFactory。由 RabbitConnectionFactoryBean 创建的 RabbitMQ ConnectionFactory 实例也默认禁用了此选项。

常规变更

ExchangeBuilder 现在默认构建持久化交换机。在 @QeueueBinding 中使用的 @Exchange 注解也默认声明持久化交换机。在 @RabbitListener 中使用的 @Queue 注解默认情况下,如果命名则声明持久化队列,如果匿名则声明非持久化队列。有关更多信息,请参阅 队列和交换机的构建器 API基于注解的监听器端点

已删除的类

不再提供 UniquelyNameQueue。使用唯一名称创建持久化的非自动删除队列是不常见的。此类已被删除。如果您需要其功能,请使用 new Queue(UUID.randomUUID().toString())

新的监听器容器

除了现有的 SimpleMessageListenerContainer 之外,还添加了 DirectMessageListenerContainer。有关如何选择要使用的容器以及如何配置它们的信息,请参阅 选择容器消息监听器容器配置

Log4j 附加程序

由于 log4j 已停止维护,因此此附加程序不再可用。有关可用日志附加程序的信息,请参阅 日志子系统 AMQP 附加程序

RabbitTemplate 变更

以前,如果非事务性 RabbitTemplate 在事务性监听器容器线程上运行,则它会参与现有事务。这是一个严重的错误。但是,用户可能依赖此行为。从 1.6.2 版本开始,您必须在模板上设置 channelTransacted 布尔值才能使其参与容器事务。

RabbitTemplate 现在使用 DirectReplyToMessageListenerContainer(默认情况下)而不是为每个请求创建新的消费者。有关更多信息,请参阅 RabbitMQ 直接回复

AsyncRabbitTemplate 现在支持直接回复。有关更多信息,请参阅 异步 Rabbit 模板

RabbitTemplateAsyncRabbitTemplate 现在具有 receiveAndConvertconvertSendAndReceiveAsType 方法,这些方法接受 ParameterizedTypeReference<T> 参数,允许调用方指定要将结果转换到的类型。这对于复杂类型或消息头中未传递类型信息的情况特别有用。它需要一个 SmartMessageConverter,例如 Jackson2JsonMessageConverter。有关更多信息,请参阅请求/回复消息传递异步 Rabbit 模板使用 RabbitTemplateMessage 转换[json-complex]

您现在可以使用 RabbitTemplate 在专用通道上执行多个操作。有关更多信息,请参阅作用域操作

监听器适配器

可以使用方便的 FunctionalInterface 将 lambda 表达式与 MessageListenerAdapter 一起使用。有关更多信息,请参阅MessageListenerAdapter

监听器容器更改

预取默认值

预取默认值过去为 1,这可能导致有效消费者的利用率不足。默认预取值现在为 250,这应该能够在大多数常见场景中使消费者保持忙碌状态,从而提高吞吐量。

在某些情况下,预取值应保持较低,例如,对于大型消息,尤其是在处理速度较慢的情况下(消息可能会在客户端进程中累积大量内存),以及在需要严格的消息排序时(在这种情况下,预取值应设置回 1)。此外,对于低容量消息传递和多个消费者(包括单个监听器容器实例内的并发),您可能希望减少预取以在消费者之间获得更均匀的消息分配。

有关预取的更多背景信息,请参阅这篇关于RabbitMQ 中消费者利用率的文章和这篇关于排队理论的文章。

消息计数

以前,MessageProperties.getMessageCount() 会为容器发出的消息返回 0。此属性仅在您使用 basicGet(例如,来自 RabbitTemplate.receive() 方法)时适用,现在对于容器消息初始化为 null

事务回滚行为

事务回滚时的消息重新入队现在保持一致,无论是否配置了事务管理器。有关更多信息,请参阅关于已接收消息回滚的说明

关闭行为

如果容器线程在 shutdownTimeout 内未响应关闭,则默认情况下会强制关闭通道。有关更多信息,请参阅消息监听器容器配置

接收消息后处理器

如果 afterReceiveMessagePostProcessors 属性中的 MessagePostProcessor 返回 null,则消息将被丢弃(并在适当情况下确认)。

连接工厂更改

连接和通道监听器接口现在提供了一种获取有关异常信息的机制。有关更多信息,请参阅连接和通道监听器发布是异步的 - 如何检测成功和失败

现在提供了一个新的 ConnectionNameStrategy,用于从 AbstractConnectionFactory 中填充目标 RabbitMQ 连接的应用程序特定标识。有关更多信息,请参阅连接和资源管理

重试更改

不再提供 MissingMessageIdAdvice。其功能现在已内置。有关更多信息,请参阅同步操作中的故障和重试选项

匿名队列命名

默认情况下,AnonymousQueues 现在使用默认的 Base64UrlNamingStrategy 命名,而不是简单的 UUID 字符串。有关更多信息,请参阅AnonymousQueue

@RabbitListener 更改

您现在可以在 @RabbitListener 注解中提供简单的队列声明(仅绑定到默认交换机)。有关更多信息,请参阅注解驱动的监听器端点

您现在可以配置 @RabbitListener 注解,以便将任何异常返回给发送方。您还可以配置 RabbitListenerErrorHandler 来处理异常。有关更多信息,请参阅处理异常

当您使用 @QueueBinding 注解时,您现在可以将队列绑定到多个路由键。此外,@QueueBinding.exchange() 现在支持自定义交换机类型并默认声明持久交换机。

您现在可以在注解级别设置监听器容器的 concurrency,而不必为不同的并发设置配置不同的容器工厂。

您现在可以在注解级别设置监听器容器的 autoStartup 属性,覆盖容器工厂中的默认设置。

您现在可以在 RabbitListener 容器工厂中设置接收后和发送前(回复)MessagePostProcessor 实例。

有关更多信息,请参阅注解驱动的监听器端点

从 2.0.3 版开始,类级 @RabbitListener 上的 @RabbitHandler 注解之一可以被指定为默认注解。有关更多信息,请参阅多方法监听器

容器条件回滚

当使用外部事务管理器(如 JDBC)时,当您为容器提供事务属性时,现在支持基于规则的回滚。当您使用事务建议时,它现在也更加灵活。有关更多信息,请参阅条件回滚

删除 Jackson 1.x 支持

在以前的版本中已弃用,Jackson 1.x 转换器和相关组件现已删除。您可以使用基于 Jackson 2.x 的类似组件。有关更多信息,请参阅JSON 消息转换器

JSON 消息转换器

当入站 JSON 消息的 TypeId 设置为 Hashtable 时,默认转换类型现在为 LinkedHashMap。以前,它是 Hashtable。要恢复为 Hashtable,您可以在 DefaultClassMapper 上使用 setDefaultMapType

XML 解析器

在解析 QueueExchange XML 组件时,如果存在 id 属性,则解析器不再将 name 属性值注册为 bean 别名。有关更多信息,请参阅关于 idname 属性的说明

已阻止的连接

您现在可以将 com.rabbitmq.client.BlockedListener 注入到 org.springframework.amqp.rabbit.connection.Connection 对象中。此外,当连接被代理阻止或取消阻止时,ConnectionFactory 会发出 ConnectionBlockedEventConnectionUnblockedEvent 事件。

有关更多信息,请参阅连接和资源管理