1.6 版本以来的变化 (相较于 1.5 版本)
测试支持
现已提供新的测试支持库。更多信息请参阅 测试支持。
Builder
现在提供了为配置 Queue
和 Exchange
对象提供 Fluent API 的 Builder。更多信息请参阅 队列和交换器的 Builder API。
命名空间变化
连接工厂
现在,您可以在连接工厂 bean 声明中添加 thread-factory
,例如,为 amqp-client
库创建的线程命名。更多信息请参阅 连接与资源管理。
当您使用 CacheMode.CONNECTION
时,现在可以限制允许的最大连接数。更多信息请参阅 连接与资源管理。
队列定义
现在您可以为匿名队列提供命名策略。更多信息请参阅 AnonymousQueue
。
监听器容器变化
空闲消息监听器检测
现在您可以配置监听器容器在空闲时发布 ApplicationEvent
实例。更多信息请参阅 检测空闲的异步消费者。
不匹配队列检测
默认情况下,当监听器容器启动时,如果检测到属性或参数不匹配的队列,容器会记录异常但继续监听。容器现在有一个名为 mismatchedQueuesFatal
的属性,如果在启动期间检测到该问题,它将阻止容器(和上下文)启动。如果在之后检测到该问题,例如从连接故障中恢复后,它也会停止容器。更多信息请参阅 消息监听器容器配置。
默认错误处理器
默认错误处理器 (ConditionalRejectingErrorHandler
) 现在将不可恢复的 @RabbitListener
异常视为致命错误。更多信息请参阅 异常处理。
AutoDeclare
和 RabbitAdmin
实例
关于 autoDeclare
选项在使用应用上下文中的 RabbitAdmin
实例时的语义变化,请参阅 消息监听器容器配置 (autoDeclare
)。
AmqpTemplate
:带超时的接收
为 AmqpTemplate
及其 RabbitTemplate
实现引入了一些新的带 timeout
的 receive()
方法。更多信息请参阅 轮询消费者。
使用 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
在输出时也能正确地“转换”。
更多信息请参阅 消息属性转换器。
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
数量一样大——这是多余的,因为容器消费者通道从未被缓存。
Java 反序列化
当您使用 Java 反序列化时,现在可以配置一个允许的类“白名单”。如果您接受来自不受信任来源的序列化 Java 对象的消息,应考虑创建白名单。更多信息请参阅 amqp/message-converters.adoc#java-deserialization[Java 反序列化]。
JSON MessageConverter
对 JSON 消息转换器的改进现在允许消费消息头部中没有类型信息的消息。更多信息请参阅 注解方法的消息转换 和 Jackson2JsonMessageConverter
。