跳到主要内容
版本:4.1.1

1.6 自 1.5 以来的变更

Doubao 中英对照 Changes in 1.6 Since 1.5

测试支持​

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

Builder​

现在提供用于配置 Queue 和 Exchange 对象、且具有 fluent API 的 Builder。更多信息参见队列与 Exchange 的 Builder API。

命名空间变更​

连接工厂​

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

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

队列定义​

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

Listener 容器变更​

空闲消息 Listener 检测​

现在可以配置 listener 容器在空闲时发布 ApplicationEvent 实例。更多信息参见检测空闲异步 Consumer。

不匹配队列检测​

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

Listener 容器日志​

现在,listener 容器会把它的 beanName 作为 threadNamePrefix 提供给内部的 SimpleAsyncTaskExecutor。这对日志分析很有用。

默认错误处理程序​

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

AutoDeclare 与 RabbitAdmin 实例​

关于应用上下文中 RabbitAdmin 实例的使用,该选项语义有一些变化,参见消息 Listener 容器配置(autoDeclare)。

AmqpTemplate:带超时的 receive​

为 AmqpTemplate 及其 RabbitTemplate 实现引入了多个带 timeout 的 receive() 方法。更多信息参见轮询 Consumer。

使用 AsyncRabbitTemplate​

引入了新的 AsyncRabbitTemplate。该 template 提供多个发送和接收方法,其返回值是 ListenableFuture,之后可用于同步或异步地获取结果。更多信息参见Async Rabbit Template。

RabbitTemplate 变更​

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

RabbitTemplate 现在支持 user-id-expression(使用 Java 配置时为 userIdExpression)。更多信息参见已验证用户 ID 的 RabbitMQ 文档和已验证用户 ID。

消息属性​

使用 CorrelationId​

correlationId 消息属性现在可以是 String。更多信息参见消息属性转换器。

长字符串 Header​

此前,DefaultMessagePropertiesConverter 会把长于长字符串上限(默认 1024)的 header“转换”为 DataInputStream(实际上是引用 LongString 实例的 DataInputStream)。在输出时,该 header 不做转换(除非转为 String——例如通过对流调用 toString() 得到 java.io.DataInputStream@1d057a39)。

从本版本开始,长的 LongString 实例默认仍保持为 LongString 实例。你可以通过 getBytes[]、toString() 或 getStream() 方法访问其内容。传入的大 LongString 现在在输出时也能正确“转换”。

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

入站投递模式​

deliveryMode 属性不再映射到 MessageProperties.deliveryMode。如果同一个 MessageProperties 对象被用于发送出站消息,此变更可避免意外传播。取而代之,入站 deliveryMode header 映射到 MessageProperties.receivedDeliveryMode。

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

使用注解端点时,该 header 以名为 AmqpHeaders.RECEIVED_DELIVERY_MODE 的 header 提供。

更多信息参见注解端点方法签名。

入站用户 ID​

user_id 属性不再映射到 MessageProperties.userId。如果同一个 MessageProperties 对象被用于发送出站消息,此变更可避免意外传播。取而代之,入站 userId header 映射到 MessageProperties.receivedUserId。

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

使用注解端点时,该 header 以名为 AmqpHeaders.RECEIVED_USER_ID 的 header 提供。

更多信息参见注解端点方法签名。

RabbitAdmin 变更​

声明失败​

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

@RabbitListener 变更​

每个 Bean 多个容器​

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

@SendTo SpEL 表达式​

用于路由没有 replyTo 属性的回复的 @SendTo,现在可以是针对请求/回复求值的 SpEL 表达式。更多信息参见回复管理。

@QueueBinding 改进​

现在可以在 @QueueBinding 注解中为队列、exchange 和 binding 指定参数。@QueueBinding 现在支持 header exchange。更多信息参见注解驱动的 Listener 端点。

延迟消息 Exchange​

Spring AMQP 现在对 RabbitMQ 延迟消息 Exchange 插件提供一等支持。更多信息参见延迟消息 Exchange。

Exchange internal 标志​

现在任何 Exchange 定义都可以标记为 internal,RabbitAdmin 在声明 exchange 时会把该值传给 broker。更多信息参见配置 Broker。

CachingConnectionFactory 变更​

CachingConnectionFactory 缓存统计​

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

访问底层 RabbitMQ 连接工厂​

新增了一个 getter 以提供对底层工厂的访问。例如,你可以使用此 getter 添加自定义连接属性。更多信息参见添加自定义 Client 连接属性。

Channel 缓存​

默认 channel 缓存大小已从 1 增加到 25。更多信息参见连接与资源管理。

此外,SimpleMessageListenerContainer 不再把缓存大小调整为至少与 concurrentConsumers 数量一样大——这是多余的,因为容器 consumer 的 channel 从不被缓存。

使用 RabbitConnectionFactoryBean​

该工厂 Bean 现在暴露一个属性,用于为所得工厂所建立的连接添加 client 连接属性。

Java 反序列化​

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

JSON MessageConverter​

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

日志 Appender​

Log4j 2​

新增了 log4j 2 appender,并且现在可以用 addresses 属性配置 appender 以连接到 broker 集群。

Client 连接属性​

现在可以向 RabbitMQ 连接添加自定义 client 连接属性。

更多信息参见日志子系统 AMQP Appender。