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())
。
Log4j 附加程序
由于 log4j 已停止维护,因此此附加程序不再可用。有关可用日志附加程序的信息,请参阅 日志子系统 AMQP 附加程序。
RabbitTemplate
变更
以前,如果非事务性 RabbitTemplate 在事务性监听器容器线程上运行,则它会参与现有事务。这是一个严重的错误。但是,用户可能依赖此行为。从 1.6.2 版本开始,您必须在模板上设置 channelTransacted 布尔值才能使其参与容器事务。 |
RabbitTemplate
现在使用 DirectReplyToMessageListenerContainer
(默认情况下)而不是为每个请求创建新的消费者。有关更多信息,请参阅 RabbitMQ 直接回复。
AsyncRabbitTemplate
现在支持直接回复。有关更多信息,请参阅 异步 Rabbit 模板。
RabbitTemplate
和 AsyncRabbitTemplate
现在具有 receiveAndConvert
和 convertSendAndReceiveAsType
方法,这些方法接受 ParameterizedTypeReference<T>
参数,允许调用方指定要将结果转换到的类型。这对于复杂类型或消息头中未传递类型信息的情况特别有用。它需要一个 SmartMessageConverter
,例如 Jackson2JsonMessageConverter
。有关更多信息,请参阅请求/回复消息传递、异步 Rabbit 模板、使用 RabbitTemplate
从 Message
转换 和 [json-complex]。
您现在可以使用 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 的类似组件。有关更多信息,请参阅JSON 消息转换器。
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
对象中。此外,当连接被代理阻止或取消阻止时,ConnectionFactory
会发出 ConnectionBlockedEvent
和 ConnectionUnblockedEvent
事件。
有关更多信息,请参阅连接和资源管理。