1.6 版本相较于 1.5 版本的变更
测试支持
现在提供了一个新的测试支持库。测试支持以获取更多信息。
构建器
提供流畅 API 用于配置 Queue 和 Exchange 对象的构建器现已可用。有关更多信息,请参阅 队列和交换机的构建器 API。
命名空间变更
连接工厂
现在,您可以在连接工厂 Bean 声明中添加 thread-factory —— 例如,用于命名由 amqp-client 库创建的线程。连接与资源管理 获取更多信息。
当你使用 CacheMode.CONNECTION 时,现在可以限制允许的总连接数。连接与资源管理 以获取更多信息。
队列定义
现在您可以为匿名队列提供命名策略。有关更多信息,请参阅 AnonymousQueue。
监听器容器变更
空闲消息监听器检测
现在,您可以配置监听器容器,在空闲时发布 ApplicationEvent 个实例。有关更多信息,请参阅 检测空闲异步消费者。
队列不匹配检测
默认情况下,当监听器容器启动时,如果检测到队列的属性或参数不匹配,容器会记录异常但继续监听。现在,容器增加了一个名为 mismatchedQueuesFatal 的属性,该属性可在启动期间检测到此类问题时阻止容器(以及上下文)启动。此外,若在后续阶段(例如在从连接故障中恢复后)检测到此类问题,该属性也会停止容器运行。有关更多信息,请参阅 消息监听器容器配置。
默认错误处理器
默认错误处理器(ConditionalRejectingErrorHandler)现在将不可恢复的 @RabbitListener 异常视为致命异常。有关更多信息,请参阅 异常处理。
AutoDeclare和RabbitAdmin实例
参见 消息监听容器配置(autoDeclare)以了解该选项语义的一些变更,这些变更与应用程序上下文中使用 RabbitAdmin 实例相关。
AmqpTemplate: 带超时的接收
引入了若干新的 receive() 方法,这些方法与 timeout 相关,适用于 AmqpTemplate 及其 RabbitTemplate 实现类。有关更多信息,请参阅 轮询消费者(Polling Consumer)。
使用AsyncRabbitTemplate
已引入一个新的 AsyncRabbitTemplate。
此模板提供多种发送和接收方法,其返回值为 ListenableFuture,可用于稍后以同步或异步方式获取结果。
有关更多信息,请参阅 异步 Rabbit 模板。
RabbitTemplate变更
1.4.1 版本引入了在代理支持的情况下直接使用 回复地址(reply-to) 的能力。
与为每个回复分别使用临时队列相比,这种方式更高效。
此版本允许您覆盖该默认行为,通过将 useTemporaryReplyQueues 属性设置为 true 来使用临时队列。
有关更多信息,请参见 RabbitMQ 直接回复地址。
The RabbitTemplate now supports a user-id-expression (userIdExpression when using Java configuration). See Validated User-ID RabbitMQ documentation and Validated User Id for more information.
消息属性
使用CorrelationId
消息属性 correlationId 现在可以是 String。有关更多信息,请参阅 消息属性转换器。
长字符串标题
之前,DefaultMessagePropertiesConverter“转换”了长度超过长字符串限制(默认为1024)的头字段,将其转换为DataInputStream(实际上,它引用了LongString实例的DataInputStream)。在输出时,该头字段未被转换(仅转换为字符串——例如,通过调用java.io.DataInputStream@1d057a39在流上执行toString()来实现)。
在此版本中,长 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 或更高版本时,现在可以向 @RabbitListener 类或其方法上添加多个 @Bean 注解。在使用 Java 7 或更早版本时,您可以使用 @RabbitListeners 容器注解来提供相同的功能。有关更多信息,请参阅 @Repeatable @RabbitListener。
@SendToSpEL 表达式
@SendTo 用于路由回复,当没有 replyTo 属性时,现在可以作为 SpEL 表达式在请求/回复上下文中进行求值。有关更多信息,请参阅 回复管理。
@QueueBinding改进
现在,您可以在 @QueueBinding 注解中为队列、交换机和绑定指定参数。
头交换机现已由 @QueueBinding 支持。
有关更多信息,请参阅 注解驱动的监听器端点。
延迟消息交换
Spring AMQP 现在已对 RabbitMQ 延迟消息交换插件提供第一类支持。有关更多信息,请参阅 延迟消息交换。
交换内部标志
任何 Exchange 定义现在都可以标记为 internal,并且 RabbitAdmin 在声明交换器时将该值传递给代理服务器。有关更多信息,请参阅 配置代理服务器。
CachingConnectionFactory变更
CachingConnectionFactory缓存统计
该 CachingConnectionFactory 现在可在运行时提供缓存属性,并通过 JMX 进行访问。
有关更多信息,请参阅 运行时缓存属性。
访问底层的 RabbitMQ 连接工厂
已添加一个新的getter,用于访问底层工厂。您可以使用此getter,例如,添加自定义连接属性。有关更多信息,请参阅添加自定义客户端连接属性。
频道缓存
默认通道缓存大小已从 1 增加到 25。连接与资源管理 了解更多信息。
此外,SimpleMessageListenerContainer 不再将缓存大小调整为至少等于 concurrentConsumers 的数量——这是多余的,因为容器消费者通道永远不会被缓存。
Java 反序列化
现在,您可以在使用 Java 反序列化时配置一个“允许列表”,以指定可接受的类。如果您从不可信源接收包含已序列化 Java 对象的消息,则应考虑创建一个允许列表。有关更多详情,请参阅 amqp/message-converters.adoc#java-deserialization[Java 反序列化]。
JSONMessageConverter
对 JSON 消息转换器的改进现在允许处理消息头中不包含类型信息的消息。
有关更多信息,请参阅 带注解方法的消息转换 和 Jackson2JsonMessageConverter。