1.6 自 1.5 以来的变更
测试支持
现在提供了一个新的测试支持库。更多信息参见测试支持。
Builder
现在提供用于配置 Queue 和 Exchange 对象、且具有 fluent API 的 Builder。更多信息参见队列与 Exchange 的 Builder API。
命名空间变更
连接工厂
现在可以为连接工厂 Bean 声明添加 thread-factory——例如,为 amqp-client 库创建的线程命名。更多信息参见连接与资源管理。
当使用 CacheMode.CONNECTION 时,现在可以限制允许的连接总数。更多信息参见连接与资源管理。
队列定义
现在可以为匿名队列提供命名策略。更多信息参见AnonymousQueue。
Listener 容器变更
空闲消息 Listener 检测
现在可以配置 listener 容器在空闲时发布 ApplicationEvent 实例。更多信息参见检测空闲异步 Consumer。
不匹配队列检测
默认情况下,listener 容器启动时,如果检测到属性或参数不匹配的队列,容器会记录该异常但继续监听。容器现在有一个名为 mismatchedQueuesFatal 的属性,如果在启动期间检测到问题,它会阻止容器(及上下文)启动。如果之后检测到问题(例如从连接故障恢复之后),它也会停止容器。更多信息参见消息 Listener 容器配置。
Listener 容器日志
现在,listener 容器会把它的 beanName 作为 threadNamePrefix 提供给内部的 SimpleAsyncTaskExecutor。这对日志分析很有用。
默认错误处理程序
默认错误处理程序(ConditionalRejectingErrorHandler)现在将不可恢复的 @RabbitListener 异常视为致命。更多信息参见异常处理。
AutoDeclare 与 RabbitAdmin 实例
关于应用上下文中 RabbitAdmin 实例的使用,该选项语义有一些变化,参见消息 Listener 容器配置(autoDeclare)。
AmqpTemplate:带超时的 receive
为 AmqpTemplate 及其 RabbitTemplate 实现引入了多个带 timeout 的 receive() 方法。更多信息参见轮询 Consumer。
使用 AsyncRabbitTemplate
引入了新的 AsyncRabbitTemplate。该 template 提供多个发送和接收方法,其返回值是 ListenableFuture,之后可用于同步或异步地获取结果。更多信息参见Async Rabbit Template。
RabbitTemplate 变更
1.4.1 引入了在 broker 支持时使用direct reply-to 的能力。它比为每次回复使用临时队列更高效。本版本允许你覆盖此默认行为,通过将 useTemporaryReplyQueues 属性设为 true 来使用临时队列。更多信息参见RabbitMQ Direct reply-to。
RabbitTemplate 现在支持 user-id-expression(使用 Java 配置时为 userIdExpression)。更多信息参见已验证用户 ID 的 RabbitMQ 文档和已验证用户 ID。
消息属性
使用 CorrelationId
correlationId 消息属性现在可以是 String。更多信息参见消息属性转换器。
长字符串 Header
此前,DefaultMessagePropertiesConverter 会把长于长字符串上限(默认 1024)的 header“转换”为 DataInputStream(实际上是引用 LongString 实例的 DataInputStream)。在输出时,该 header 不做转换(除非转为 String——例如通过对流调用 toString() 得到 java.io.DataInputStream@1d057a39)。
从本版本开始,长的 LongString 实例默认仍保持为 LongString 实例。你可以通过 getBytes[]、toString() 或 getStream() 方法访问其内容。传入的大 LongString 现在在输出时也能正确“转换”。
更多信息参见消息属性转换器。
入站投递模式
deliveryMode 属性不再映射到 MessageProperties.deliveryMode。如果同一个 MessageProperties 对象被用于发送出站消息,此变更可避免意外传播。取而代之,入站 deliveryMode header 映射到 MessageProperties.receivedDeliveryMode。
更多信息参见消息属性转换器。
使用注解端点时,该 header 以名为 AmqpHeaders.RECEIVED_DELIVERY_MODE 的 header 提供。
更多信息参见注解端点方法签名。
入站用户 ID
user_id 属性不再映射到 MessageProperties.userId。如果同一个 MessageProperties 对象被用于发送出站消息,此变更可避免意外传播。取而代之,入站 userId header 映射到 MessageProperties.receivedUserId。
更多信息参见消息属性转换器。
使用注解端点时,该 header 以名为 AmqpHeaders.RECEIVED_USER_ID 的 header 提供。
更多信息参见注解端点方法签名。
RabbitAdmin 变更
声明失败
此前,ignoreDeclarationFailures 标志仅对 channel 上的 IOException(例如参数不匹配)生效。现在它对任何异常(例如 TimeoutException)都生效。此外,每当声明失败时,现在都会发布 DeclarationExceptionEvent。RabbitAdmin 的最后一次声明事件也可通过属性 lastDeclarationExceptionEvent 获取。更多信息参见配置 Broker。
@RabbitListener 变更
每个 Bean 多个容器
使用 Java 8 或更高版本时,现在可以在 @Bean 类或其方法上添加多个 @RabbitListener 注解。使用 Java 7 或更早版本时,可以使用 @RabbitListeners 容器注解来提供相同功能。更多信息参见@Repeatable @RabbitListener。
@SendTo SpEL 表达式
用于路由没有 replyTo 属性的回复的 @SendTo,现在可以是针对请求/回复求值的 SpEL 表达式。更多信息参见回复管理。
@QueueBinding 改进
现在可以在 @QueueBinding 注解中为队列、exchange 和 binding 指定参数。@QueueBinding 现在支持 header exchange。更多信息参见注解驱动的 Listener 端点。
延迟消息 Exchange
Spring AMQP 现在对 RabbitMQ 延迟消息 Exchange 插件提供一等支持。更多信息参见延迟消息 Exchange。
Exchange internal 标志
现在任何 Exchange 定义都可以标记为 internal,RabbitAdmin 在声明 exchange 时会把该值传给 broker。更多信息参见配置 Broker。
CachingConnectionFactory 变更
CachingConnectionFactory 缓存统计
CachingConnectionFactory 现在在运行时和通过 JMX 提供缓存属性。更多信息参见运行时缓存属性。
访问底层 RabbitMQ 连接工厂
新增了一个 getter 以提供对底层工厂的访问。例如,你可以使用此 getter 添加自定义连接属性。更多信息参见添加自定义 Client 连接属性。
Channel 缓存
默认 channel 缓存大小已从 1 增加到 25。更多信息参见连接与资源管理。
此外,SimpleMessageListenerContainer 不再把缓存大小调整为至少与 concurrentConsumers 数量一样大——这是多余的,因为容器 consumer 的 channel 从不被缓存。
使用 RabbitConnectionFactoryBean
该工厂 Bean 现在暴露一个属性,用于为所得工厂所建立的连接添加 client 连接属性。
Java 反序列化
使用 Java 反序列化时,现在可以配置可允许类的“允许列表”。如果你从不可信来源接收带序列化 Java 对象的消息,应考虑创建允许列表。更多信息参见 amqp/message-converters.adoc#java-deserialization[Java Deserialization]。
JSON MessageConverter
JSON 消息转换器的改进现在允许消费消息头中没有类型信息的消息。更多信息参见注解方法的消息转换和Jackson2JsonMessageConverter。
日志 Appender
Log4j 2
新增了 log4j 2 appender,并且现在可以用 addresses 属性配置 appender 以连接到 broker 集群。
Client 连接属性
现在可以向 RabbitMQ 连接添加自定义 client 连接属性。
更多信息参见日志子系统 AMQP Appender。