2.0 版本相对于 1.7 版本的变更
使用 CachingConnectionFactory
从 2.0.2 版本开始,你可以配置 RabbitTemplate
使用与监听器容器所使用的连接不同的连接。
此更改可避免当生产者因任何原因被阻塞时,消费者死锁的情况。
更多信息请参见 使用单独连接。
AMQP 客户端库
Spring AMQP 现在使用 RabbitMQ 团队提供的 amqp-client
库的 5.0.x 新版本。
此客户端默认配置了自动恢复功能。
请参见 RabbitMQ 自动连接/拓扑恢复。
从 4.0 版本开始,客户端默认启用自动恢复。
虽然与此功能兼容,但 Spring AMQP 拥有自己的恢复机制,通常不需要客户端恢复功能。
我们建议你禁用 |
一般性变更
ExchangeBuilder
现在默认构建持久化交换机。
@QeueueBinding
中使用的 @Exchange
注解也默认声明持久化交换机。
@RabbitListener
中使用的 @Queue
注解默认声明持久化队列(如果命名)和非持久化队列(如果匿名)。
更多信息请参见 队列和交换机的构建器 API 和 注解驱动的监听器端点。
已删除的类
UniquelyNameQueue
不再提供。
创建具有唯一名称的持久化非自动删除队列是不常见的。
此类别已删除。
如果你需要其功能,请使用 new Queue(UUID.randomUUID().toString())
。
Log4j Appender
由于 log4j 已停止维护,此 appender 不再可用。 有关可用日志 appender 的信息,请参见 日志子系统 AMQP Appender。
RabbitTemplate
变更
以前,如果非事务性 RabbitTemplate
在事务性监听器容器线程上运行,它会参与现有事务。
这是一个严重的错误。
然而,用户可能已经依赖此行为。
从 1.6.2 版本开始,你必须在模板上设置 channelTransacted
布尔值,它才能参与容器事务。
RabbitTemplate
现在(默认情况下)使用 DirectReplyToMessageListenerContainer
,而不是为每个请求创建新的消费者。
更多信息请参见 RabbitMQ 直接回复。
AsyncRabbitTemplate
现在支持直接回复。
更多信息请参见 异步 Rabbit 模板。
RabbitTemplate
和 AsyncRabbitTemplate
现在具有 receiveAndConvert
和 convertSendAndReceiveAsType
方法,这些方法接受 ParameterizedTypeReference<T>
参数,允许调用者指定将结果转换为的类型。
这对于复杂类型或消息头中未传输类型信息的情况特别有用。
它需要一个 SmartMessageConverter
,例如 Jackson2JsonMessageConverter
。
更多信息请参见 请求/回复消息传递、异步 Rabbit 模板、使用 RabbitTemplate
从 Message
转换 和 使用 RabbitTemplate
从 Message
转换。
你现在可以使用 RabbitTemplate
在专用通道上执行多个操作。
更多信息请参见 作用域操作。
监听器适配器
现在提供了一个方便的 FunctionalInterface
,用于将 lambda 与 MessageListenerAdapter
结合使用。
更多信息请参见 MessageListenerAdapter
。
监听器容器变更
预取默认值
预取默认值曾经是 1,这可能导致高效消费者的利用率不足。 默认预取值现在是 250,这应该在大多数常见场景中让消费者保持忙碌,从而提高吞吐量。
在某些场景下,预取值应该较低——例如,对于大型消息,特别是当处理速度较慢时(消息可能在客户端进程中累积大量内存),以及当严格的消息顺序是必需时(在这种情况下,预取值应设置回 1)。 此外,对于低量消息传递和多个消费者(包括单个监听器容器实例内的并发),你可能希望减少预取以获得更均匀的消息分布。
有关预取的更多背景信息,请参阅这篇关于 RabbitMQ 中消费者利用率 的文章以及这篇关于 排队理论 的文章。
消息计数
以前,MessageProperties.getMessageCount()
对于容器发出的消息返回 0
。
此属性仅在你使用 basicGet
(例如,来自 RabbitTemplate.receive()
方法)时适用,并且现在对于容器消息初始化为 null
。
事务回滚行为
无论是否配置事务管理器,事务回滚时的消息重新入队行为现在是一致的。 更多信息请参见 关于已接收消息回滚的注意事项。
关闭行为
如果容器线程在 shutdownTimeout
内未响应关闭,则默认情况下会强制关闭通道。
更多信息请参见 消息监听器容器配置。
连接工厂变更
连接和通道监听器接口现在提供了一种获取异常信息的机制。 更多信息请参见 连接和通道监听器 和 发布是异步的——如何检测成功和失败。
现在提供了一个新的 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 解析器
解析 Queue
和 Exchange
XML 组件时,如果存在 id
属性,解析器不再将 name
属性值注册为 bean 别名。
更多信息请参见 关于 id
和 name
属性的注意事项。
阻塞连接
你现在可以将 com.rabbitmq.client.BlockedListener
注入到 org.springframework.amqp.rabbit.connection.Connection
对象中。
此外,当连接被 Broker 阻塞或解除阻塞时,ConnectionFactory
会发出 ConnectionBlockedEvent
和 ConnectionUnblockedEvent
事件。
更多信息请参见 连接和资源管理。