1.6 版本相对于 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 附加器。