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 现在默认构建持久交换机。在 @QueueBinding 中使用的 @Exchange 注解也默认声明持久交换机。在 @RabbitListener 中使用的 @Queue 注解默认情况下,如果命名,则声明持久队列;如果匿名,则声明非持久队列。有关更多信息,请参阅 队列和交换机的 Builder 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 事件。
有关更多信息,请参阅 连接和资源管理。