跳到主要内容

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

DeepSeek V3 中英对照 Changes in 1.6 Since 1.5

测试支持

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

建造者模式

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

命名空间变更

连接工厂

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

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

队列定义

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

监听器容器变更

空闲消息监听器检测

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

不匹配队列检测

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

监听器容器日志记录

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

默认错误处理程序

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

AutoDeclareRabbitAdmin 实例

请参阅 消息监听器容器配置 (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)都生效。此外,每当声明失败时,现在都会发布一个 DeclarationExceptionEventRabbitAdmin 的最后一个声明事件也可以通过属性 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 附加器