1.6 相较于 1.5 的更改
测试支持
现在提供了一个新的测试支持库。有关更多信息,请参阅测试支持。
构建器
现在可以使用提供流畅 API 来配置Queue
和Exchange
对象的构建器。有关更多信息,请参阅队列和交换机的构建器 API。
命名空间更改
连接工厂
您现在可以向连接工厂 bean 声明添加thread-factory
——例如,为amqp-client
库创建的线程命名。有关更多信息,请参阅连接和资源管理。
当您使用CacheMode.CONNECTION
时,您现在可以限制允许的总连接数。有关更多信息,请参阅连接和资源管理。
队列定义
您现在可以为匿名队列提供命名策略。有关更多信息,请参阅AnonymousQueue
。
监听器容器更改
空闲消息监听器检测
您现在可以配置监听器容器,以便在空闲时发布ApplicationEvent
实例。有关更多信息,请参阅检测空闲异步消费者。
不匹配队列检测
默认情况下,当监听器容器启动时,如果检测到属性或参数不匹配的队列,容器会记录异常,但会继续监听。容器现在有一个名为mismatchedQueuesFatal
的属性,如果在启动期间检测到问题,则该属性会阻止容器(和上下文)启动。如果稍后检测到问题(例如,从连接故障中恢复后),它还会停止容器。有关更多信息,请参阅消息监听器容器配置。
默认错误处理程序
默认错误处理程序(ConditionalRejectingErrorHandler
)现在将不可恢复的@RabbitListener
异常视为严重错误。有关更多信息,请参阅异常处理。
AutoDeclare
和RabbitAdmin
实例
有关该选项在应用程序上下文中使用RabbitAdmin
实例时的语义的一些更改,请参阅消息监听器容器配置(autoDeclare
)。
AmqpTemplate
:带超时的接收
为AmqpTemplate
及其RabbitTemplate
实现引入了一些新的带timeout
的receive()
方法。有关更多信息,请参阅轮询消费者。
使用AsyncRabbitTemplate
引入了新的AsyncRabbitTemplate
。此模板提供了一些发送和接收方法,其中返回值为ListenableFuture
,稍后可用于同步或异步获取结果。有关更多信息,请参阅异步 Rabbit 模板。
RabbitTemplate
更改
1.4.1 引入了在代理支持的情况下使用直接回复的功能。它比为每个回复使用临时队列更有效率。此版本允许您覆盖此默认行为并通过将useTemporaryReplyQueues
属性设置为true
来使用临时队列。有关更多信息,请参阅RabbitMQ 直接回复。
RabbitTemplate
现在支持user-id-expression
(使用 Java 配置时为userIdExpression
)。有关更多信息,请参阅RabbitMQ 文档中的验证用户 ID和验证用户 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
头部映射到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
使用。更多信息,请参见配置代理。
@RabbitListener
更改
每个Bean的多个容器
使用Java 8或更高版本时,您现在可以向@Bean
类或其方法添加多个@RabbitListener
注解。使用Java 7或更低版本时,可以使用@RabbitListeners
容器注解来提供相同的功能。更多信息,请参见@Repeatable
@RabbitListener
。
@SendTo
SpEL表达式
没有replyTo
属性的路由回复的@SendTo
现在可以是针对请求/回复计算的SpEL表达式。更多信息,请参见回复管理。
@QueueBinding
改进
您现在可以在@QueueBinding
注解中为队列、交换机和绑定指定参数。@QueueBinding
现在支持头部交换机。更多信息,请参见基于注解的监听器端点。
延迟消息交换
Spring AMQP现在对RabbitMQ延迟消息交换插件提供了一流的支持。更多信息,请参见延迟消息交换。
交换机内部标志
任何Exchange
定义现在都可以标记为internal
,并且RabbitAdmin
在声明交换机时会将该值传递给代理。更多信息,请参见配置代理。
CachingConnectionFactory
更改
CachingConnectionFactory
缓存统计
CachingConnectionFactory
现在在运行时和通过JMX提供缓存属性。更多信息,请参见运行时缓存属性。
访问底层的RabbitMQ连接工厂
添加了一个新的getter来访问底层工厂。例如,您可以使用此getter添加自定义连接属性。更多信息,请参见添加自定义客户端连接属性。
通道缓存
默认通道缓存大小已从1增加到25。更多信息,请参见连接和资源管理。
此外,SimpleMessageListenerContainer
不再调整缓存大小以至少与concurrentConsumers
的数量一样大——这是多余的,因为容器使用者通道永远不会被缓存。
Java反序列化
使用Java反序列化时,您现在可以配置允许的类的“允许列表”。如果您接受来自不受信任来源的包含序列化Java对象的邮件,则应考虑创建允许列表。更多信息,请参见Java反序列化。
JSON MessageConverter
对JSON消息转换器的改进现在允许使用消息头中没有类型信息的邮件。更多信息,请参见带注解方法的消息转换和[json-message-converter]。