跳到主要内容
版本:3.2.3

1.6 版本相对于 1.5 版本的变更

DeepSeek V3 中英对照 Changes in 1.6 Since 1.5

测试支持​

现在提供了一个新的测试支持库。更多信息请参见测试支持。

建造者模式​

现在提供了用于配置 Queue 和 Exchange 对象的流畅 API 构建器。更多信息请参见 队列和交换机的构建器 API。

命名空间变更​

连接工厂​

你现在可以在连接工厂 bean 声明中添加一个 thread-factory —— 例如,为 amqp-client 库创建的线程命名。更多信息请参阅连接与资源管理。

当你使用 CacheMode.CONNECTION 时,现在可以限制允许的总连接数。更多信息请参阅连接和资源管理。

队列定义​

现在你可以为匿名队列提供命名策略。更多信息请参见匿名队列。

监听器容器变更​

空闲消息监听器检测​

现在,您可以配置监听器容器在空闲时发布 ApplicationEvent 实例。有关更多信息,请参见检测空闲的异步消费者。

不匹配队列检测​

默认情况下,当监听器容器启动时,如果检测到属性或参数不匹配的队列,容器会记录异常但继续监听。现在,容器有一个名为 mismatchedQueuesFatal 的属性,如果在启动期间检测到问题,该属性会阻止容器(以及上下文)启动。如果在稍后检测到问题,例如在从连接故障恢复后,它也会停止容器。有关更多信息,请参阅消息监听器容器配置。

监听器容器日志记录​

现在,监听器容器将其 beanName 作为 threadNamePrefix 提供给内部的 SimpleAsyncTaskExecutor。这对于日志分析非常有用。

默认错误处理程序​

默认的错误处理程序(ConditionalRejectingErrorHandler)现在将不可恢复的 @RabbitListener 异常视为致命错误。有关更多信息,请参阅异常处理。

AutoDeclare 和 RabbitAdmin 实例​

请参阅 消息监听器容器配置 (autoDeclare) 以了解该选项在应用上下文中使用 RabbitAdmin 实例时的语义变化。

AmqpTemplate: 带超时的接收​

为 AmqpTemplate 及其 RabbitTemplate 实现引入了多个带有 timeout 的新 receive() 方法。有关更多信息,请参阅 轮询消费者。

使用 AsyncRabbitTemplate​

引入了一个新的 AsyncRabbitTemplate。该模板提供了多种发送和接收方法,其返回值是一个 ListenableFuture,可以稍后用于同步或异步获取结果。有关更多信息,请参阅 异步 Rabbit 模板。

RabbitTemplate 变更​

1.4.1 版本引入了在代理支持时使用 direct reply-to 的能力。它比为每个回复使用临时队列更高效。此版本允许您通过将 useTemporaryReplyQueues 属性设置为 true 来覆盖此默认行为并使用临时队列。有关更多信息,请参阅 RabbitMQ Direct reply-to。

RabbitTemplate 现在支持 user-id-expression(在使用 Java 配置时为 userIdExpression)。更多信息请参阅 Validated User-ID RabbitMQ 文档 和 Validated User Id。

消息属性​

使用 CorrelationId​

correlationId 消息属性现在可以是一个 String。更多信息请参阅消息属性转换器。

长字符串头​

之前,DefaultMessagePropertiesConverter 会将超过长字符串限制(默认 1024)的标头“转换”为 DataInputStream(实际上,它引用了 LongString 实例的 DataInputStream)。在输出时,此标头不会被转换(除了转换为字符串 —— 例如,通过在流上调用 toString() 得到类似 java.io.DataInputStream@1d057a39 的结果)。

在此版本中,默认情况下,较长的 LongString 实例将保持为 LongString 实例。你可以通过 getBytes[]、toString() 或 getStream() 方法来访问其内容。现在,较大的传入 LongString 在输出时也会正确“转换”。

更多信息请参见消息属性转换器。

入站交付模式​

deliveryMode 属性不再映射到 MessageProperties.deliveryMode。这一更改避免了在发送出站消息时,如果使用了相同的 MessageProperties 对象,导致 deliveryMode 意外传播的问题。相反,入站的 deliveryMode 头部现在映射到 MessageProperties.receivedDeliveryMode。

更多信息请参见消息属性转换器。

在使用注解端点时,头信息会通过名为 AmqpHeaders.RECEIVED_DELIVERY_MODE 的头提供。

有关更多信息,请参见带注解的端点方法签名。

入站用户 ID​

user_id 属性不再映射到 MessageProperties.userId。这一更改避免了如果使用相同的 MessageProperties 对象发送出站消息时意外的传播。相反,入站的 userId 标头被映射到 MessageProperties.receivedUserId。

有关更多信息,请参见消息属性转换器。

当你使用注解端点时,头信息会在名为 AmqpHeaders.RECEIVED_USER_ID 的头中提供。

有关更多信息,请参见带注释的端点方法签名。

RabbitAdmin 变更​

声明失败​

之前,ignoreDeclarationFailures 标志仅对通道上的 IOException(例如参数不匹配)生效。现在,它对任何异常(例如 TimeoutException)都生效。此外,每当声明失败时,现在都会发布一个 DeclarationExceptionEvent。RabbitAdmin 的最后一个声明事件也可以通过属性 lastDeclarationExceptionEvent 获取。更多信息请参见 配置 Broker。

@RabbitListener 的变化​

每个 Bean 的多个容器​

当你使用 Java 8 或更高版本时,你现在可以在 @Bean 类或其方法上添加多个 @RabbitListener 注解。当使用 Java 7 或更早版本时,你可以使用 @RabbitListeners 容器注解来提供相同的功能。更多信息请参见 @Repeatable @RabbitListener。

@SendTo SpEL 表达式​

@SendTo 现在可以用于在没有 replyTo 属性的情况下路由回复,它可以是对请求/回复进行评估的 SpEL 表达式。更多信息请参见 回复管理。

@QueueBinding 改进​

现在你可以在 @QueueBinding 注解中为队列、交换器和绑定指定参数。@QueueBinding 现在支持头部交换器。更多信息请参阅基于注解的异步监听端点。

延迟消息交换​

Spring AMQP 现在对 RabbitMQ 延迟消息交换插件提供了原生支持。更多信息请参见延迟消息交换。

Exchange 内部标志​

现在,任何 Exchange 定义都可以标记为 internal,并且 RabbitAdmin 在声明交换器时会将这个值传递给代理。有关更多信息,请参阅 配置代理。

CachingConnectionFactory 的变更​

CachingConnectionFactory 缓存统计​

CachingConnectionFactory 现在支持在运行时和通过 JMX 提供缓存属性。更多信息请参阅 运行时缓存属性。

访问底层的 RabbitMQ 连接工厂​

新增了一个 getter 方法,用于提供对底层工厂的访问。例如,您可以使用此 getter 来添加自定义连接属性。更多信息请参阅 添加自定义客户端连接属性。

通道缓存​

默认的通道缓存大小已从 1 增加到 25。更多信息请参阅连接与资源管理。

此外,SimpleMessageListenerContainer 不再调整缓存大小以确保其至少与 concurrentConsumers 的数量一样大——这是多余的,因为容器消费者的通道从不被缓存。

使用 RabbitConnectionFactoryBean​

工厂 bean 现在暴露了一个属性,用于向由该工厂创建的连接添加客户端连接属性。

Java 反序列化​

现在,您可以在使用 Java 反序列化时配置一个“允许列表”来指定允许的类。如果您从不受信任的来源接收包含序列化 Java 对象的消息,您应该考虑创建一个允许列表。更多信息请参见 amqp/message-converters.adoc#java-deserialization[Java 反序列化]。

JSON MessageConverter​

对 JSON 消息转换器的改进现在允许消费那些消息头中没有类型信息的消息。更多信息请参阅带注解方法的消息转换和Jackson2JsonMessageConverter。

日志附加器​

Log4j 2​

已添加了一个 log4j 2 appender,现在可以通过 addresses 属性配置 appender 以连接到 broker 集群。

客户端连接属性​

现在,您可以为 RabbitMQ 连接添加自定义客户端连接属性。

有关更多信息,请参见日志子系统 AMQP 附加器。