1.6 相较于 1.5 的更改

测试支持

现在提供了一个新的测试支持库。有关更多信息,请参阅测试支持

构建器

现在可以使用提供流畅 API 来配置QueueExchange对象的构建器。有关更多信息,请参阅队列和交换机的构建器 API

命名空间更改

连接工厂

您现在可以向连接工厂 bean 声明添加thread-factory——例如,为amqp-client库创建的线程命名。有关更多信息,请参阅连接和资源管理

当您使用CacheMode.CONNECTION时,您现在可以限制允许的总连接数。有关更多信息,请参阅连接和资源管理

队列定义

您现在可以为匿名队列提供命名策略。有关更多信息,请参阅AnonymousQueue

监听器容器更改

空闲消息监听器检测

您现在可以配置监听器容器,以便在空闲时发布ApplicationEvent实例。有关更多信息,请参阅检测空闲异步消费者

不匹配队列检测

默认情况下,当监听器容器启动时,如果检测到属性或参数不匹配的队列,容器会记录异常,但会继续监听。容器现在有一个名为mismatchedQueuesFatal的属性,如果在启动期间检测到问题,则该属性会阻止容器(和上下文)启动。如果稍后检测到问题(例如,从连接故障中恢复后),它还会停止容器。有关更多信息,请参阅消息监听器容器配置

监听器容器日志记录

现在,监听器容器将其beanName作为threadNamePrefix提供给内部SimpleAsyncTaskExecutor。这对于日志分析很有用。

默认错误处理程序

默认错误处理程序(ConditionalRejectingErrorHandler)现在将不可恢复的@RabbitListener异常视为严重错误。有关更多信息,请参阅异常处理

AutoDeclareRabbitAdmin实例

有关该选项在应用程序上下文中使用RabbitAdmin实例时的语义的一些更改,请参阅消息监听器容器配置autoDeclare)。

AmqpTemplate:带超时的接收

AmqpTemplate及其RabbitTemplate实现引入了一些新的带timeoutreceive()方法。有关更多信息,请参阅轮询消费者

使用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)都有效。此外,每当声明失败时,都会发布DeclarationExceptionEventRabbitAdmin的最后声明事件也可以作为属性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的数量一样大——这是多余的,因为容器使用者通道永远不会被缓存。

使用RabbitConnectionFactoryBean

工厂bean现在公开了一个属性,用于向生成的工厂创建的连接添加客户端连接属性。

Java反序列化

使用Java反序列化时,您现在可以配置允许的类的“允许列表”。如果您接受来自不受信任来源的包含序列化Java对象的邮件,则应考虑创建允许列表。更多信息,请参见Java反序列化

JSON MessageConverter

对JSON消息转换器的改进现在允许使用消息头中没有类型信息的邮件。更多信息,请参见带注解方法的消息转换[json-message-converter]

日志附加器

Log4j 2

添加了一个log4j 2附加器,并且现在可以使用addresses属性配置附加器以连接到代理集群。

客户端连接属性

您现在可以向RabbitMQ连接添加自定义客户端连接属性。

更多信息,请参见日志子系统AMQP附加器