1.6 相较于 1.5 的变化

测试支持

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

构建器

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

命名空间变化

连接工厂

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

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

队列定义

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

监听器容器变化

空闲消息监听器检测

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

不匹配队列检测

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

监听器容器日志记录

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

默认错误处理器

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

AutoDeclareRabbitAdmin 实例

请参见 消息监听器容器配置 (autoDeclare),了解该选项在应用程序上下文中使用 RabbitAdmin 实例的一些语义变化。

AmqpTemplate:带超时接收

AmqpTemplate 及其 RabbitTemplate 实现中引入了许多带有 timeout 的新 receive() 方法。 更多信息请参见 轮询消费者

使用 AsyncRabbitTemplate

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

RabbitTemplate 变化

1.4.1 引入了当 broker 支持时使用 直接回复 的能力。 它比为每个回复使用临时队列更高效。 此版本允许您通过将 useTemporaryReplyQueues 属性设置为 true 来覆盖此默认行为并使用临时队列。 更多信息请参见 RabbitMQ 直接回复

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

消息属性

使用 CorrelationId

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

长字符串头部

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

在此版本中,长的 LongString 实例现在默认保留为 LongString 实例。 您可以使用 getBytes[]toString()getStream() 方法访问其内容。 大的传入 LongString 现在在输出时也能正确地“转换”。

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

入站投递模式

deliveryMode 属性不再映射到 MessageProperties.deliveryMode。 此更改避免了如果使用相同的 MessageProperties 对象发送出站消息时意外传播。 相反,入站 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 定义现在都可以标记为 internal,并且 RabbitAdmin 在声明交换机时将该值传递给 broker。 更多信息请参见 配置 Broker

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 追加器,并且追加器现在可以使用 addresses 属性配置以连接到 broker 集群。

客户端连接属性

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

更多信息请参见 日志子系统 AMQP 追加器