1.6 版本以来的变化 (相较于 1.5 版本)

测试支持

现已提供新的测试支持库。更多信息请参阅 测试支持

Builder

现在提供了为配置 QueueExchange 对象提供 Fluent API 的 Builder。更多信息请参阅 队列和交换器的 Builder API

命名空间变化

连接工厂

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

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

队列定义

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

监听器容器变化

空闲消息监听器检测

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

不匹配队列检测

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

监听器容器日志记录

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

默认错误处理器

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

AutoDeclareRabbitAdmin 实例

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

AmqpTemplate:带超时的接收

AmqpTemplate 及其 RabbitTemplate 实现引入了一些新的带 timeoutreceive() 方法。更多信息请参阅 轮询消费者

使用 AsyncRabbitTemplate

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

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)。在输出时,此头部没有被转换(除了转换为 String,例如通过调用流上的 toString() 得到的 java.io.DataInputStream@1d057a39)。

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

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

入站 Delivery Mode

deliveryMode 属性不再映射到 MessageProperties.deliveryMode。此更改避免了在使用同一个 MessageProperties 对象发送出站消息时发生意外传播。取而代之的是,入站 deliveryMode 头部被映射到 MessageProperties.receivedDeliveryMode

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

在使用注解端点时,该头部在名为 AmqpHeaders.RECEIVED_DELIVERY_MODE 的头部中提供。

更多信息请参阅 注解端点方法签名

入站 User ID

user_id 属性不再映射到 MessageProperties.userId。此更改避免了在使用同一个 MessageProperties 对象发送出站消息时发生意外传播。取而代之的是,入站 userId 头部被映射到 MessageProperties.receivedUserId

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

在使用注解端点时,该头部在名为 AmqpHeaders.RECEIVED_USER_ID 的头部中提供。

更多信息请参阅 注解端点方法签名

RabbitAdmin 变化

声明失败

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

@RabbitListener 变化

每个 Bean 的多个容器

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

@SendTo SpEL 表达式

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

@QueueBinding 改进

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

延迟消息交换器

Spring AMQP 现在对 RabbitMQ Delayed Message 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

日志 Appender

Log4j 2

已添加一个 Log4j 2 appender,现在可以通过 addresses 属性配置这些 appender 以连接到代理集群。

客户端连接属性

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

更多信息请参阅 日志子系统 AMQP Appender