|
此版本仍在开发中,目前尚不稳定。如需最新稳定版本,请使用 Spring AMQP 4.0.2! |
2.0 版本相较于 1.7 版本的变更
使用CachingConnectionFactory
从版本 2.0.2 开始,您可以将 RabbitTemplate 配置为使用与监听器容器所用不同的连接。此更改可避免因任何原因导致生产者被阻塞时出现消费者死锁的情况。有关更多信息,请参阅 使用独立连接。
AMQP 客户端库
Spring AMQP 现在使用 RabbitMQ 团队提供的新版 5.0.x 版本的 amqp-client 库。该客户端默认配置了自动恢复功能。请参阅 RabbitMQ 自动连接/拓扑恢复。
| 从 4.0 版本开始,客户端默认启用了自动恢复功能。 虽然与该功能兼容,但 Spring AMQP 自身也具备恢复机制,通常无需使用客户端的恢复功能。 我们建议禁用 从 1.7.1 版本开始,Spring AMQP 默认禁用该功能,除非您显式创建自己的 RabbitMQ 连接工厂并将其提供给 RabbitMQ |
常规变更
默认情况下,ExchangeBuilder 现在会创建持久化交换机。@Exchange 注解在 @QeueueBinding 内部使用时,也会默认声明持久化交换机。@Queue 注解在 @RabbitListener 内部使用时,默认情况下:若交换机命名,则声明为持久化队列;若匿名,则声明为非持久化队列。有关更多信息,请参阅 队列和交换机的构建器 API 以及 注解驱动的监听器端点。
删除的类
UniquelyNameQueue 已不再提供。
以唯一名称创建持久化且非自动删除的队列是不常见的。
此类已删除。
如果您需要其功能,请使用 new Queue(UUID.randomUUID().toString())。
Log4j Appender
由于 log4j 已进入生命周期结束阶段,此追加器现已不可用。
有关可用的日志追加器的信息,请参阅 日志子系统 AMQP 追加器。
RabbitTemplate变更
之前,非事务性的 RabbitTemplate 若在事务性监听器容器线程上运行,则会参与现有事务。这是一个严重错误。然而,用户可能已依赖此行为。从 1.6.2 版本开始,您必须在模板上设置 channelTransacted 的布尔值,才能使其参与容器事务。 |
现在,RabbitTemplate 默认使用 DirectReplyToMessageListenerContainer(而不是为每个请求创建新的消费者)。
现在,RabbitTemplate 和 AsyncRabbitTemplate 已经具有接受 ParameterizedTypeReference<T> 参数的 receiveAndConvert 和 convertSendAndReceiveAsType 方法,允许调用者指定将结果转换为哪种类型。这在处理复杂类型或当类型信息未通过消息头传递时特别有用。它需要一个 SmartMessageConverter,例如 Jackson2JsonMessageConverter。有关更多信息,请参阅 请求/回复消息、异步 Rabbit 模板、使用 RabbitTemplate 从 Message 转换,以及 使用 RabbitTemplate 从 Message 转换。
现在,您可以使用 RabbitTemplate 在专用通道上执行多项操作。
有关更多信息,请参阅 作用域操作。
监听器适配器
一个方便的 FunctionalInterface 可用于在 MessageListenerAdapter 中使用 lambda 表达式。请参阅 MessageListenerAdapter 以获取更多信息。
监听器容器变更
预取默认值
预取默认值曾为1,这可能导致高效消费者未被充分利用。当前默认预取值为250,这在大多数常见场景中应能保持消费者的忙碌状态,从而提升吞吐量。
| 在某些场景下,预取值应设置得较低——例如,当消息较大时,尤其是处理速度较慢(消息可能在客户端进程中累积成大量内存),并且需要严格的消息顺序时(此时应将预取值重置为1)。</p><p>此外,在低频消息传递且存在多个消费者(包括单个监听容器实例内的并发)的情况下,您可能希望降低预取值,以实现消息在各消费者之间更均衡的分配。 |
有关预取的更多背景信息,请参阅这篇关于 RabbitMQ 中消费者利用率 的文章,以及这篇关于 排队论 的文章。
消息数量
之前,MessageProperties.getMessageCount() 对由容器发出的消息返回 0。此属性仅在使用 basicGet(例如从 RabbitTemplate.receive() 方法中)时适用,并且现在已初始化为 null,用于容器消息。
事务回滚行为
在事务回滚时重新排队消息现在是一致的,无论是否配置了事务管理器。
有关更多信息,请参阅 《关于已接收消息回滚的说明》。
关闭行为
如果容器线程在 shutdownTimeout 秒内未响应关闭请求,则默认会强制关闭通道。有关更多信息,请参阅 消息监听器容器配置。
连接工厂变更
连接和通道监听器接口现在提供了一种机制,用于获取有关异常的信息。连接和通道监听器 以及 发布是异步的——如何检测成功与失败 可了解更多信息。
现在提供了一个新的 ConnectionNameStrategy,用于从 AbstractConnectionFactory 中填充针对目标 RabbitMQ 连接的应用程序特定标识信息。
有关更多信息,请参阅 连接与资源管理。
重试更改
The MissingMessageIdAdvice is no longer provided. Its functionality is now built-in. See Failures in Synchronous Operations and Options for Retry for more information.
匿名队列命名
默认情况下,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 而被阻塞或解除阻塞时,ConnectionBlockedEvent 和 ConnectionUnblockedEvent 事件由 ConnectionFactory 发出。
请参阅 连接与资源管理 以获取更多信息。