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())

新的监听器容器

DirectMessageListenerContainer 已与现有的 SimpleMessageListenerContainer 一同添加。 有关选择使用哪个容器以及如何配置它们的信息,请参见 选择容器消息监听器容器配置

Log4j Appender

由于 log4j 已停止维护,此 appender 不再可用。 有关可用日志 appender 的信息,请参见 日志子系统 AMQP Appender

RabbitTemplate 变更

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

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

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

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

你现在可以使用 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 的类似组件。 更多信息请参见 Jackson2JsonMessageConverter

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 对象中。 此外,当连接被 Broker 阻塞或解除阻塞时,ConnectionFactory 会发出 ConnectionBlockedEventConnectionUnblockedEvent 事件。

更多信息请参见 连接和资源管理