Spring AMQP项目(五)_客户端

参考文档的这一部分简要介绍了 Spring 集成项目中的 AMQP 支持。

5.1. 弹簧集成AMQP支持

这个简短的章节涵盖了Spring Integration和Spring AMQP项目之间的关系。

5.1.1. 简介

Spring 集成项目包括基于 Spring AMQP 项目构建的 AMQP 通道适配器和网关。 这些适配器是在 Spring 集成项目中开发和发布的。 在 Spring 集成中,“通道适配器”是单向的(单向),而“网关”是双向的(请求-回复)。 我们提供入站通道适配器、出站通道适配器、入站网关和出站网关。

由于 AMQP 适配器是 Spring 集成发行版的一部分,因此该文档作为 Spring 集成发行版的一部分提供。 我们在此处提供了主要功能的快速概述。 有关更多详细信息,请参阅 Spring 集成参考指南。

5.1.2. 入站通道适配器

要从队列接收 AMQP 消息,您可以配置 . 以下示例演示如何配置入站通道适配器:​​<inbound-channel-adapter>​

<amqp:inbound-channel-adapter channel="fromAMQP"
queue-names="some.queue"
connection-factory="rabbitConnectionFactory"/>

5.1.3. 出站通道适配器

要将 AMQP 消息发送到交换机,您可以配置 . 除了交换名称之外,您还可以选择提供“路由密钥”。 以下示例演示如何定义出站通道适配器:​​<outbound-channel-adapter>​

<amqp:outbound-channel-adapter channel="toAMQP"
exchange-name="some.exchange"
routing-key="foo"
amqp-template="rabbitTemplate"/>

5.1.4. 入站网关

要从队列接收 AMQP 消息并响应其回复地址,您可以配置 . 以下示例演示如何定义入站网关:​​<inbound-gateway>​

<amqp:inbound-gateway request-channel="fromAMQP"
reply-channel="toAMQP"
queue-names="some.queue"
connection-factory="rabbitConnectionFactory"/>

5.1.5. 出站网关

要将 AMQP 消息发送到交换机并从远程客户端接收响应,您可以配置 . 除了交换名称之外,您还可以选择提供“路由密钥”。 以下示例演示如何定义出站网关:​​<outbound-gateway>​

<amqp:outbound-gateway request-channel="toAMQP"
reply-channel="fromAMQP"
exchange-name="some.exchange"
routing-key="foo"
amqp-template="rabbitTemplate"/>

6. 其他资源

除了此参考文档之外,还有许多其他资源可以帮助您了解 AMQP。

6.1. 延伸阅读

对于那些不熟悉AMQP的人来说,该规范实际上是相当可读的。 当然,它是权威的信息来源,对于任何熟悉该规范的人来说,Spring AMQP 代码都应该很容易理解。 我们目前对 RabbitMQ 支持的实现是基于他们的 2.8.x 版本,它正式支持 AMQP 0.8 和 0.9.1。 我们建议阅读 0.9.1 文档。

RabbitMQ 入门页面上提供了许多很棒的文章、演示文稿和博客。 由于这是目前唯一受支持的Spring AMQP实现,因此我们还建议将其作为所有与经纪人相关的问题的一般起点。

附录A:千分尺观察文档

A.1. 可观测性 - 指标

您可以在下面找到此项目声明的所有指标的列表。

A.1.1. 侦听器观察


兔子听众的观察。


指标名称(由约定类定义)。类型 .​​spring.rabbit.listener​​​​RabbitListenerObservation$DefaultRabbitListenerObservationConvention​​​​timer​

指标名称(由约定类定义)。类型 .​​spring.rabbit.listener.active​​​​RabbitListenerObservation$DefaultRabbitListenerObservationConvention​​​​long task timer​

启动观察后添加的键值可能从 *.active 指标中丢失。

千分尺内部用于基础单元。但是,每个后端确定实际的基本单位。(即普罗米修斯使用秒)​​nanoseconds​

封闭类的名称。​​RabbitListenerObservation​

所有标签必须以前缀为前缀!​​spring.rabbit.listener​

表 5.低基数键



名字





描述





​spring.rabbit.listener.id​​ (必填)





侦听器 ID。



A.1.2. 模板观察


观察兔子模板。


指标名称(由约定类定义)。类型 .​​spring.rabbit.template​​​​RabbitTemplateObservation$DefaultRabbitTemplateObservationConvention​​​​timer​

指标名称(由约定类定义)。类型 .​​spring.rabbit.template.active​​​​RabbitTemplateObservation$DefaultRabbitTemplateObservationConvention​​​​long task timer​

启动观察后添加的键值可能从 *.active 指标中丢失。

千分尺内部用于基础单元。但是,每个后端确定实际的基本单位。(即普罗米修斯使用秒)​​nanoseconds​

封闭类的名称。​​RabbitTemplateObservation​

所有标签必须以前缀为前缀!​​spring.rabbit.template​

表 6.低基数键



名字





描述





​spring.rabbit.template.name​​ (必填)





模板的 Bean 名称。



A.2. 可观测性 - 跨度

您可以在下面找到该项目声明的所有跨度的列表。

A.2.1. 侦听器观察跨度


兔子听众的观察。


跨度名称(由约定类定义)。​​spring.rabbit.listener​​​​RabbitListenerObservation$DefaultRabbitListenerObservationConvention​

封闭类的名称。​​RabbitListenerObservation​

所有标签必须以前缀为前缀!​​spring.rabbit.listener​

表 7.标签键

名字

描述

​spring.rabbit.listener.id​​ (必填)

侦听器 ID。

A.2.2. 模板观察跨度


观察兔子模板。


跨度名称(由约定类定义)。​​spring.rabbit.template​​​​RabbitTemplateObservation$DefaultRabbitTemplateObservationConvention​

封闭类的名称。​​RabbitTemplateObservation​

所有标签必须以前缀为前缀!​​spring.rabbit.template​

表 8.标签键

名字

描述

​spring.rabbit.template.name​​ (必填)

模板的 Bean 名称。

A.3. 可观测性 - 约定

您可以在下面找到该项目声明的所有列表。​​GlobalObservabilityConventions​​​​ObservabilityConventions​

表 9.观察公约的实施

观察约定类名

适用的观察上下文类名

​RabbitListenerObservation.DefaultRabbitListenerObservationConvention​

​RabbitMessageReceiverContext​

​RabbitTemplateObservation.DefaultRabbitTemplateObservationConvention​

​RabbitMessageSenderContext​

附录 B:原生镜像

提供了Spring AOT本机提示,以帮助为使用Spring AMQP的Spring应用程序开发本机映像。

一些例子可以在 spring-aot-smoke-tests GitHub 存储库中看到。

附录 C:更改历史记录

本节介绍在版本更改时所做的更改。

C.1. 当前版本

查看新增功能。

C.2. 以前的版本

C.2.1. 自 2.4 以来 2.3 的变化

本节介绍版本 2.3 和版本 2.4 之间的更改。 有关以前版本中的更改,请参阅更改历史记录。

​@RabbitListener​​变化

​MessageProperties​​现在可用于参数匹配。 有关详细信息,请参阅带批注的终结点方法签名。

​RabbitAdmin​​变化

新属性允许恢复手动声明的队列/交换/绑定。 有关详细信息,请参阅恢复自动删除声明。​​recoverManualDeclarations​

远程处理支持

使用 Spring Framework 的 RMI 支持支持远程处理已被弃用,并将在 3.0 中删除。有关更多信息,请参阅使用 AMQP 的 Spring 远程处理。

C.2.2. 消息转换器更改

现在可以从标头确定字符集。 请参阅 Jackson2JsonMessageConverter 了解更多信息。​​Jackson2JsonMessageConverter​​​​contentEncoding​

C.2.3. 消息转换器更改

现在可以从标头确定字符集。 请参阅 Jackson2JsonMessageConverter 了解更多信息。​​Jackson2JsonMessageConverter​​​​contentEncoding​

C.2.4. 流支持更改

​RabbitStreamOperations​​并已被弃用,分别赞成和;他们返回而不是. 有关更多信息,请参阅 使用 RabbitMQ 流插件。​​RabbitStreamTemplate​​​​RabbitStreamOperations2​​​​RabbitStreamTemplate2​​​​CompletableFuture​​​​ListenableFuture​

C.2.5. 自 2.3 以来 2.2 的变化

本节介绍版本 2.2 和版本 2.3 之间的更改。 有关以前版本中的更改,请参阅更改历史记录。

连接工厂更改

现在提供了两个额外的连接工厂。 有关详细信息,请参阅选择连接工厂。

@RabbitListener变化

您现在可以指定回复内容类型。 有关详细信息,请参阅答复内容类型。

消息转换器更改

如果配置了自定义反序列化程序,则 现在可以反序列化抽象类(包括接口)。 有关更多信息,请参见反序列化抽象类。​​Jackson2JMessageConverter​​​​ObjectMapper​

测试更改

提供了一个新的注释,用于在不使用 时自动配置某些基础结构 Bean。 有关详细信息,请参阅@SpringRabbitTest。​​@SpringRabbitTest​​​​SpringBootTest​

兔子模板更改

模板已经过重构,以便在 lambda 表达式中更简单地使用。 有关详细信息,请参阅相关发布者确认和返回。ReturnCallbackReturnsCallback

使用返回和相关确认时,现在需要一个唯一的属性。 有关详细信息,请参阅相关发布者确认和返回。CorrelationDataid

使用直接回复时,您现在可以配置模板,以便服务器不需要返回与回复相关的数据。 请参阅 RabbitMQ Direct 回复 了解更多信息。

侦听器容器更改

新的侦听器容器属性现已可用;这在使用 RabbitMQ 分片插件时很有帮助。​​consumeDelay​

默认现在调用 。 若要还原到以前的行为(不执行任何操作),请添加无操作处理程序。​​JavaLangErrorHandler​​​​System.exit(99)​

容器现在支持为通道全局应用的属性,而不是为通道上的每个使用者应用全局。​​globalQos​​​​prefetchCount​

有关详细信息,请参阅消息侦听器容器配置。

消息后处理器更改

压缩现在使用逗号而不是冒号来分隔多个内容编码。 解压缩程序可以处理这两种格式,但是,如果您生成此版本的消息,而这些消息由 2.2.12 之前的版本使用,则应将压缩程序配置为使用旧的分隔符。 有关详细信息,请参阅修改消息 - 压缩等中的重要说明。MessagePostProcessor

多代理支持改进

有关更多信息,请参阅多代理(或集群)支持。

重新发布邮件恢复程序更改

未提供此恢复器的新子类,以支持发布者确认。 有关详细信息,请参阅消息侦听器和异步案例。

C.2.6. 自 2.2 以来 2.1 的变化

本节介绍版本 2.1 和版本 2.2 之间的更改。

包更改

以下类/接口已从 移至:​​org.springframework.amqp.rabbit.core.support​​​​org.springframework.amqp.rabbit.batch​

  • ​BatchingStrategy​
  • ​MessageBatch​
  • ​SimpleBatchingStrategy​

此外,已从 移至 。​​ListenerExecutionFailedException​​​​org.springframework.amqp.rabbit.listener.exception​​​​org.springframework.amqp.rabbit.support​

依赖关系更改

JUnit (4) 现在是一个可选的依赖项,将不再显示为传递依赖项。

该模块现在是模块中的编译依赖项,以获得更好的目标应用程序开发体验,而我们只需一个即可获得 AMQP 组件的完整测试实用程序堆栈。​​spring-rabbit-junit​​​​spring-rabbit-test​​​​spring-rabbit-test​

“中断性”API 更改

JUnit (5) 现在返回一个实例而不是依赖于 JUnit 4 的实例。 它具有相同的 API,因此只需更改任何引用的类名即可。 有关详细信息,请参阅 JUnit5 条件。​​RabbitAvailableCondition.getBrokerRunning()​​​​BrokerRunningSupport​​​​BrokerRunning​

侦听器容器更改

默认情况下,具有致命异常的消息现在将被拒绝且不会重新排队,即使确认模式是手动的也是如此。 有关详细信息,请参阅异常处理。

现在可以使用千分尺 s 监控侦听器性能。 有关详细信息,请参阅监视侦听器性能。​​Timer​

@RabbitListener变化

现在,您可以在每个侦听器上配置 覆盖出厂配置,以便更轻松地识别与侦听器关联的线程。 现在,您可以使用注释的属性重写容器工厂的属性。 有关详细信息,请参阅重写容器工厂属性。​​executor​​​​acknowledgeMode​​​​ackMode​

使用批处理时,方法现在可以在一次调用中接收完整的消息批次,而不是一次获取一条消息。​​@RabbitListener​

一次接收一条批处理消息时,最后一条消息的消息属性设置为 true。​​isLastInBatch​

此外,收到的批处理消息现在包含标头。​​amqp_batchSize​

侦听器也可以使用 中创建的批处理,即使批处理不是由生成者创建的。 有关更多信息,请参阅选择容器。​​SimpleMessageListenerContainer​

Spring 数据投影接口现在由 . 有关更多信息,请参阅使用 Spring 数据投影接口。​​Jackson2JsonMessageConverter​

现在假定如果没有属性,则内容为 JSON,或者它是默认值 ()。 有关详细信息,请参阅从消息转换。​​Jackson2JsonMessageConverter​​​​contentType​​​​application/octet-string​

同样地。如果没有属性,则假定内容为 XML,或者它是默认值 ()。 有关更多信息,请参阅 Jackson2XmlMessageConverter。​​Jackson2XmlMessageConverter​​​​contentType​​​​application/octet-string​

当方法返回结果时,Bean 和现在在回复消息属性中可用。 这允许配置 to,例如,在回复中设置标头以指示在服务器上调用了哪个方法。 有关详细信息,请参阅回复管理。​​@RabbitListener​​​​Method​​​​beforeSendReplyMessagePostProcessor​

现在,您可以将 配置为在发送回复消息之前对其进行修改。 有关详细信息,请参阅回复管理。​​ReplyPostProcessor​

AMQP 日志记录追加程序更改

Log4J 和 Logback 现在支持 SSL 选项。​​AmqpAppender​​​​verifyHostname​

此外,现在可以将这些追加程序配置为不将 MDC 条目添加为标头。 引入了布尔选项来配置此类行为。​​addMdcAsHeaders​

追加程序现在支持该属性。​​SaslConfig​

有关详细信息,请参阅日志记录子系统 AMQP 追加程序。

消息侦听器适配器更改

现在提供了一种新方法来构建要传递到目标侦听器的参数数组,并且弃用了旧方法。 有关详细信息,请参阅 MessageListenerAdapter 。​​MessageListenerAdapter​​​​buildListenerArguments(Object, Channel, Message)​

交换/队列声明更改

用于创建和声明对象的流畅 API 现在支持“众所周知的”参数。 有关详细信息,请参阅队列和交换的生成器 API。​​ExchangeBuilder​​​​QueueBuilder​​​​Exchange​​​​Queue​​​​RabbitAdmin​

有一个新的属性。 有关详细信息,请参阅条件声明。​​RabbitAdmin​​​​explicitDeclarationsOnly​

连接工厂更改

有一个新的属性。 提供代理节点地址列表时,将在创建连接之前对列表进行随机排序,以便尝试连接的顺序是随机的。 有关详细信息,请参阅连接到集群。​​CachingConnectionFactory​​​​shuffleAddresses​

使用发布服务器确认并返回时,现在会在连接工厂的 . 这样可以避免在从回调中执行 rabbit 操作时库中可能的死锁。 有关详细信息,请参阅相关发布者确认和返回。​​executor​​​​amqp-clients​

此外,发布者确认类型现在使用枚举而不是两个互斥的 setter 方法指定。​​ConfirmType​

现在,启用 SSL 时默认使用 TLS 1.2。 请参阅 RabbitConnectionFactoryBean 和 配置 SSL 了解更多信息。​​RabbitConnectionFactoryBean​

新消息后处理器类

类 和 分别支持压缩和解压缩,当消息内容编码设置为 .​​DeflaterPostProcessor​​​​InflaterPostProcessor​​​​deflate​

其他更改

该对象(用于声明多个队列、交换、绑定)现在对每种类型都有一个过滤的 getter。 有关详细信息,请参阅声明交换、队列和绑定的集合。​​Declarables​

现在,您可以在处理每个 Bean 的声明之前对其进行自定义。 有关详细信息,请参阅交换、队列和绑定的自动声明。​​Declarable​​​​RabbitAdmin​

​singleActiveConsumer()​​已添加到 设置队列参数。 有关详细信息,请参阅队列和交换的生成器 API。​​QueueBuilder​​​​x-single-active-consumer​

类型值的出站标头现在使用 而不是 进行映射。 有关详细信息,请参阅消息属性转换器。​​Class<?>​​​​getName()​​​​toString()​

现在支持恢复失败的生产者创建的批处理。 有关详细信息,请参阅使用批处理侦听器重试。

C.2.7. 自 2.1 以来 2.0 的变化

AMQP 客户端库

Spring AMQP 现在使用 RabbitMQ 团队提供的库的 5.4.x 版本。 默认情况下,此客户端配置了自动恢复。 请参阅 RabbitMQ 自动连接/拓扑恢复。​​amqp-client​

从版本 4.0 开始,客户端默认启用自动恢复。 虽然与此功能兼容,但Spring AMQP具有自己的恢复机制,并且通常不需要客户端恢复功能。 我们建议禁用自动恢复,以避免在代理可用但连接尚未恢复时获取实例。 从版本 1.7.1 开始,Spring AMQP 将禁用它,除非您显式创建自己的 RabbitMQ 连接工厂并将其提供给 . 默认情况下,由 创建的 RabbitMQ 实例还禁用了该选项。​​amqp-client​​​​AutoRecoverConnectionNotCurrentlyOpenException​​​​CachingConnectionFactory​​​​ConnectionFactory​​​​RabbitConnectionFactoryBean​

包更改

某些类已移动到不同的包。 大多数是内部类,不会影响用户应用程序。 两个例外是 和 。 这些接口现在位于 中。​​ChannelAwareMessageListener​​​​RabbitListenerErrorHandler​​​​org.springframework.amqp.rabbit.listener.api​

发布商确认更改

为发布者确认启用的通道不会在存在未完成确认时返回到缓存。 有关详细信息,请参阅相关发布者确认和返回。

侦听器容器工厂改进

现在,您可以使用侦听器容器工厂创建任何侦听器容器,而不仅仅是那些用于注释或 . 有关详细信息,请参阅使用容器工厂。​​@RabbitListener​​​​@RabbitListenerEndpointRegistry​

​ChannelAwareMessageListener​​现在继承自 。​​MessageListener​

代理事件侦听器

引入了 A 以将选定的代理事件发布为实例。 有关更多信息,请参阅代理事件侦听器。​​BrokerEventListener​​​​ApplicationEvent​

兔子管理员更改

发现类型的 bean(它是 - 、 和对象的容器),并在代理上声明包含的对象。 不鼓励用户使用旧的声明机制(和其他机制),而应改用 bean。 默认情况下,旧机制处于禁用状态。 有关详细信息,请参阅声明交换、队列和绑定的集合。​​RabbitAdmin​​​​Declarables​​​​Declarable​​​​Queue​​​​Exchange​​​​Binding​​​​<Collection<Queue>>​​​​Declarables​

​AnonymousQueue​​实例现在声明为“默认设置为”,以确保在应用程序连接到的节点上创建队列。 有关更多信息,请参阅配置代理。​​x-queue-master-locator​​​​client-local​

兔子模板更改

现在,您可以配置 with 选项,以控制操作中回复使用者的标志。 有关详细信息,请参阅请求/回复消息。​​RabbitTemplate​​​​noLocalReplyConsumer​​​​noLocal​​​​sendAndReceive()​

​CorrelationData​​对于发布者确认,现在有一个 ,您可以使用它来获取确认,而不是使用回调。 启用返回和确认后,相关数据(如果提供)将使用返回的消息填充。 有关详细信息,请参阅相关发布者确认和返回。​​ListenableFuture​

现在提供了一个调用的方法,用于通知子类回复已超时,从而允许任何状态清理。 有关详细信息,请参阅回复超时。​​replyTimedOut​

现在,您可以指定在传递回复(例如,延迟回复)时发生异常时,将请求/回复与 (默认值)一起使用时要调用的 。 请参阅。 (也是从 2.0.11 开始)。​​ErrorHandler​​​​DirectReplyToMessageListenerContainer​​​​setReplyErrorHandler​​​​RabbitTemplate​

消息转换

我们引入了一个新的支持将消息从 XML 格式转换为 XML 格式和将消息转换为 XML 格式。 有关更多信息,请参阅 Jackson2XmlMessageConverter。​​Jackson2XmlMessageConverter​

管理 REST API

现在已弃用,转而使用直接(或)。 请参阅 RabbitMQ REST API 了解更多信息。​​RabbitManagementTemplate​​​​com.rabbitmq.http.client.Client​​​​com.rabbitmq.http.client.ReactorNettyClient​

​@RabbitListener​​变化

现在可以为侦听器容器工厂配置 和(可选)在发送回复时使用的 。 有关详细信息,请参阅启用侦听器终结点注释。​​RetryTemplate​​​​RecoveryCallback​

异步返回​​@RabbitListener​

​@RabbitListener​​方法现在可以返回 或 。 有关详细信息,请参阅异步@RabbitListener返回类型。​​ListenableFuture<?>​​​​Mono<?>​

连接工厂 Bean 更改

默认情况下,现在调用 . 要恢复到以前的行为,请将该属性设置为 。​​RabbitConnectionFactoryBean​​​​enableHostnameVerification()​​​​enableHostnameVerification​​​​false​

连接工厂更改

现在无条件地禁用底层RabbitMQ中的自动恢复,即使在构造函数中提供了预配置的实例。 虽然已经采取措施使Spring AMQP与自动恢复兼容,但出现了某些仍然存在问题的极端情况。 Spring AMQP 从 1.0.0 开始就有了自己的恢复机制,不需要使用客户端提供的恢复。 虽然在构造 后仍然可以启用该功能(使用 ),但我们强烈建议您不要这样做。 如果您在直接使用客户端工厂(而不是使用 Spring AMQP 组件)时需要自动恢复连接,我们建议您使用单独的 RabbitMQ。​​CachingConnectionFactory​​​​ConnectionFactory​​​​cachingConnectionFactory.getRabbitConnectionFactory()​​​​.setAutomaticRecoveryEnabled()​​​​CachingConnectionFactory​​​​ConnectionFactory​

侦听器容器更改

默认值现在完全丢弃在标头存在时会导致致命错误的消息。 有关详细信息,请参阅异常处理。​​ConditionalRejectingErrorHandler​​​​x-death​

立即重新排队

引入了一个新的来通知侦听器容器必须重新排队的消息。 要使用此功能,将添加新的实现。​​ImmediateRequeueAmqpException​​​​ImmediateRequeueMessageRecoverer​

有关详细信息,请参阅消息侦听器和异步案例。

C.2.8. 自 1.7 以来 2.0 中的变化

用​​CachingConnectionFactory​

从版本 2.0.2 开始,您可以将 配置为使用与侦听器容器使用的连接不同的连接。 此更改可避免在生产者因任何原因被阻止时陷入僵局的使用者。 有关详细信息,请参阅使用单独的连接。​​RabbitTemplate​

AMQP 客户端库

Spring AMQP 现在使用 RabbitMQ 团队提供的新 5.0.x 版本的库。 默认情况下,此客户端配置了自动恢复。 请参阅 RabbitMQ 自动连接/拓扑恢复。​​amqp-client​

从版本 4.0 开始,客户端默认启用自动恢复。 虽然与此功能兼容,但Spring AMQP具有自己的恢复机制,并且通常不需要客户端恢复功能。 我们建议您禁用自动恢复,以避免在代理可用但连接尚未恢复时获取实例。 从版本 1.7.1 开始,Spring AMQP 将禁用它,除非您显式创建自己的 RabbitMQ 连接工厂并将其提供给 . 默认情况下,由 创建的 RabbitMQ 实例还禁用了该选项。​​amqp-client​​​​AutoRecoverConnectionNotCurrentlyOpenException​​​​CachingConnectionFactory​​​​ConnectionFactory​​​​RabbitConnectionFactoryBean​

一般更改

现在默认构建持久交换。 默认情况下,在 中使用的批注还声明持久交换。 默认情况下,在 中使用的批注声明持久队列(如果已命名)和非持久队列(如果匿名)。 有关更多信息,请参阅队列和交换的生成器 API 和注释驱动的侦听器终端节点。​​ExchangeBuilder​​​​@Exchange​​​​@QeueueBinding​​​​@Queue​​​​@RabbitListener​

已删除的类

​UniquelyNameQueue​​不再提供。 创建具有唯一名称的持久非自动删除队列是不寻常的。 此类已删除。 如果需要其功能,请使用 。​​new Queue(UUID.randomUUID().toString())​

新建侦听器容器

已与现有的 . 有关选择要使用的容器以及如何配置它们的信息,请参阅选择容器和消息侦听器容器配置。​​DirectMessageListenerContainer​​​​SimpleMessageListenerContainer​

Log4j 追加器

由于 log4j 的生命周期结束,此追加器不再可用。 有关可用日志追加程序的信息,请参阅日志记录子系统 AMQP 追加程序。

​RabbitTemplate​​变化

以前,如果非事务性事务在事务侦听器容器线程上运行,则该事务性事务会参与现有事务。 这是一个严重的错误。 但是,用户可能依赖于此行为。 从版本 1.6.2 开始,必须在模板上设置布尔值,以便它参与容器事务。​​RabbitTemplate​​​​channelTransacted​

现在使用 (默认情况下)而不是为每个请求创建一个新的使用者。 请参阅 RabbitMQ Direct 回复 了解更多信息。​​RabbitTemplate​​​​DirectReplyToMessageListenerContainer​

现在支持直接回复。 有关详细信息,请参阅异步兔子模板。​​AsyncRabbitTemplate​

和现在有和方法接受参数,让调用方指定要将结果转换为的类型。 这对于复杂类型或消息头中未传达类型信息时特别有用。 它需要诸如 . 有关详细信息,请参阅接收消息、请求/回复消息、异步 Rabbit 模板和使用 RabbitTemplate 从消息转换。​​RabbitTemplate​​​​AsyncRabbitTemplate​​​​receiveAndConvert​​​​convertSendAndReceiveAsType​​​​ParameterizedTypeReference<T>​​​​SmartMessageConverter​​​​Jackson2JsonMessageConverter​

现在,您可以使用 在专用通道上执行多个操作。 有关详细信息,请参阅作用域内操作。​​RabbitTemplate​

侦听器适配器

方便使用带有 . 有关详细信息,请参阅 MessageListenerAdapter 。​​FunctionalInterface​​​​MessageListenerAdapter​

侦听器容器更改
预取默认值

预取默认值曾经是 1,这可能导致高效使用者的利用率不足。 默认预取值现在为 250,这应该让使用者在最常见的情况下保持忙碌,并且, 因此,提高吞吐量。

在某些情况下,预取值应 较低 — 例如,对于大型消息,尤其是在处理速度较慢的情况下(消息可能会加起来 客户端进程中的大量内存),如果需要严格的消息排序 (在这种情况下,预取值应设置回 1)。 此外,对于低容量消息传递和多个使用者(包括单个侦听器容器实例中的并发),您可能希望减少预取,以便在使用者之间更均匀地分配消息。

有关预取的更多背景信息,请参阅这篇关于 RabbitMQ 中消费者利用率的文章和这篇关于排队理论的文章。

消息计数

以前,为容器发出的消息返回。 此属性仅在使用(例如,from 方法)时适用,并且现在初始化为容器消息。​​MessageProperties.getMessageCount()​​​​0​​​​basicGet​​​​RabbitTemplate.receive()​​​​null​

事务回滚行为

事务回滚时的消息重新排队现在是一致的,无论是否配置了事务管理器。 有关详细信息,请参阅有关回滚已接收消息的说明。

关机行为

如果容器线程没有响应 中的关闭,则默认情况下会强制关闭通道。 有关详细信息,请参阅消息侦听器容器配置。shutdownTimeout

接收消息后处理器

如果属性中的 返回 ,则丢弃消息(并在适当的情况下确认)。​​MessagePostProcessor​​​​afterReceiveMessagePostProcessors​​​​null​

连接工厂更改

连接和通道侦听器接口现在提供了一种获取异常信息的机制。 有关详细信息,请参阅连接和通道侦听器和发布是异步的 — 如何检测成功和失败。

现在提供了一个新的,用于从 填充目标 RabbitMQ 连接的应用程序特定标识。 有关详细信息,请参阅连接和资源管理。​​ConnectionNameStrategy​​​​AbstractConnectionFactory​

重试更改

不再提供。 它的功能现在是内置的。 有关详细信息,请参阅同步操作中的失败和重试选项。​​MissingMessageIdAdvice​

匿名队列命名

默认情况下,现在使用默认值而不是简单字符串命名。 有关详细信息,请参阅 AnonymousQueue。​​AnonymousQueues​​​​Base64UrlNamingStrategy​​​​UUID​

​@RabbitListener​​变化

现在,您可以在注释中提供简单的队列声明(仅绑定到默认交换)。 有关详细信息,请参阅注释驱动的侦听器终结点。​​@RabbitListener​

您现在可以配置注释,以便将任何异常返回给发件人。 您还可以配置 以处理异常。 有关详细信息,请参阅处理异常。​​@RabbitListener​​​​RabbitListenerErrorHandler​

现在,您可以在使用注释时绑定具有多个路由密钥的队列。 现在还支持自定义交换类型,并在默认情况下声明持久交换。​​@QueueBinding​​​​@QueueBinding.exchange()​

现在,您可以在注释级别设置侦听器容器的 ,而不必为不同的并发设置配置不同的容器工厂。​​concurrency​

现在可以在注释级别设置侦听器容器的属性,覆盖容器工厂中的默认设置。​​autoStartup​

现在可以在容器工厂中设置接收之后和发送(回复)实例之前。​​MessagePostProcessor​​​​RabbitListener​

有关详细信息,请参阅注释驱动的侦听器终结点。

从版本 2.0.3 开始,可以将类级别的注释之一指定为默认值。 有关详细信息,请参阅多方法侦听器。​​@RabbitHandler​​​​@RabbitListener​

容器条件回滚

使用外部事务管理器(如 JDBC)时,现在支持为容器提供事务属性时基于规则的回滚。 现在,当您使用交易建议时,它也更加灵活。 有关详细信息,请参阅条件回滚。

删除杰克逊 1.x 支持

在以前的版本中已弃用,杰克逊转换器和相关组件现已被删除。 您可以使用基于 Jackson 2.x 的类似组件。 请参阅 Jackson2JsonMessageConverter 了解更多信息。​​1.x​

JSON 消息转换器

当入站 JSON 消息设置为 时,默认转换类型现在为 。 以前,它是. 要恢复为 ,可以在 上使用 。​TypeId​​​Hashtable​​​​LinkedHashMap​​​​Hashtable​​​​Hashtable​​​​setDefaultMapType​​​​DefaultClassMapper​

XML 解析器

解析和 XML 组件时,如果存在属性,解析器将不再将属性值注册为 Bean 别名。 有关详细信息,请参阅有关 id 和名称属性的说明。​​Queue​​​​Exchange​​​​name​​​​id​

连接被阻止

您现在可以将 注入到对象中。 此外,当连接被代理阻止或取消阻止时,和 会发出 事件。​​com.rabbitmq.client.BlockedListener​​​​org.springframework.amqp.rabbit.connection.Connection​​​​ConnectionBlockedEvent​​​​ConnectionUnblockedEvent​​​​ConnectionFactory​

有关详细信息,请参阅连接和资源管理。

C.2.9. 自 1.7 以来 1.6 的变化

AMQP 客户端库

Spring AMQP 现在使用 RabbitMQ 团队提供的新 4.0.x 版本的库。 默认情况下,此客户端配置了自动恢复。 请参阅 RabbitMQ 自动连接/拓扑恢复。​​amqp-client​

默认情况下,4.0.x 客户端启用自动恢复。 虽然与此功能兼容,但Spring AMQP具有自己的恢复机制,并且通常不需要客户端恢复功能。 我们建议禁用自动恢复,以避免在代理可用但连接尚未恢复时获取实例。 从版本 1.7.1 开始,Spring AMQP 将禁用它,除非您显式创建自己的 RabbitMQ 连接工厂并将其提供给 . 默认情况下,由 创建的 RabbitMQ 实例还禁用了该选项。​​amqp-client​​​​AutoRecoverConnectionNotCurrentlyOpenException​​​​CachingConnectionFactory​​​​ConnectionFactory​​​​RabbitConnectionFactoryBean​

日志4j 2 升级

最低 Log4j 2 版本(对于 )现在是 。 该框架不再与以前的版本兼容。 有关详细信息,请参阅日志记录子系统 AMQP 追加程序。​​AmqpAppender​​​​2.7​

日志追加器

默认情况下,此追加器不再捕获调用方数据(方法、行号)。 您可以通过设置配置选项来重新启用它。 有关可用日志追加程序的信息,请参阅日志记录子系统 AMQP 追加程序。​​includeCallerData​

春季重试升级

现在,最低春季重试版本是 。 该框架不再与以前的版本兼容。​​1.2​

关机行为

您现在可以设置为 ,如果容器线程不响应 中的关闭,则强制关闭通道, 导致任何未确认的邮件重新排队。 有关详细信息,请参阅消息侦听器容器配置。​​forceCloseChannel​​​​true​​​​shutdownTimeout​

更快的 XML 杰克逊升级

杰克逊的最低版本现在是. 该框架不再与以前的版本兼容。​​2.8​

朱尼特​​@Rules​

以前由框架在内部使用的规则现在已包含在名为 的单独 jar 中。 有关详细信息,请参阅 JUnit4 @Rules。​​spring-rabbit-junit​

容器条件回滚

使用外部事务管理器(如 JDBC)时,现在支持为容器提供事务属性时基于规则的回滚。 现在,当您使用交易建议时,它也更加灵活。

连接命名策略

现在提供了一个新的,用于从 填充目标 RabbitMQ 连接的应用程序特定标识。 有关详细信息,请参阅连接和资源管理。ConnectionNameStrategyAbstractConnectionFactory

侦听器容器更改
事务回滚行为

现在,无论是否配置了事务管理器,都可以将事务回滚时的消息重新排队配置为一致。 有关详细信息,请参阅有关回滚已接收消息的说明。

C.2.10. 早期版本

有关以前版本中的更改,请参阅以前的版本。

C.2.11. 自 1.6 以来 1.5 的变化

测试支持

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

建筑工人

现在可以使用提供用于配置和对象的流畅 API 的构建器。 有关详细信息,请参阅队列和交换的生成器 API。​​Queue​​​​Exchange​

命名空间更改
连接工厂

您现在可以向连接工厂 Bean 声明添加 — 例如,命名线程 由图书馆创建。 有关详细信息,请参阅连接和资源管理。​​thread-factory​​​​amqp-client​

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

队列定义

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

侦听器容器更改
空闲消息侦听器检测

现在,您可以将侦听器容器配置为在空闲时发布实例。 有关详细信息,请参阅检测空闲异步使用者。​​ApplicationEvent​

不匹配队列检测

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

侦听器容器日志记录

现在,侦听器容器将其作为 . 它对于日志分析很有用。​​beanName​​​​SimpleAsyncTaskExecutor​​​​threadNamePrefix​

默认错误处理程序

默认错误处理程序 () 现在将不可恢复的异常视为致命异常。 有关详细信息,请参阅异常处理。​​ConditionalRejectingErrorHandler​​​​@RabbitListener​

​AutoDeclare​​和实例​​RabbitAdmin​

请参阅消息侦听器容器配置 (),了解该选项在使用方面的语义的一些更改 应用程序上下文中的实例。​​autoDeclare​​​​RabbitAdmin​

​AmqpTemplate​​:接收超时

已经为及其实现引入了许多新方法。 有关详细信息,请参阅轮询使用者。​​receive()​​​​timeout​​​​AmqpTemplate​​​​RabbitTemplate​

用​​AsyncRabbitTemplate​

引入了新的。 此模板提供了许多发送和接收方法,其中返回值为 ,可以 稍后用于同步或异步获取结果。 有关详细信息,请参阅异步兔子模板。​​AsyncRabbitTemplate​​​​ListenableFuture​

​RabbitTemplate​​变化

1.4.1 引入了在代理支持时使用直接回复的功能。 它比为每个回复使用临时队列更有效。 此版本允许您覆盖此默认行为,并通过将该属性设置为 来使用临时队列。 请参阅 RabbitMQ Direct 回复 了解更多信息。​​useTemporaryReplyQueues​​​​true​

现在支持 ( 使用 Java 配置时)。 有关详细信息,请参阅已验证的用户 ID RabbitMQ 文档和已验证的用户 ID。​​RabbitTemplate​​​​user-id-expression​​​​userIdExpression​

消息属性
用​​CorrelationId​

消息属性现在可以是 . 有关详细信息,请参阅消息属性转换器。​​correlationId​​​​String​

长字符串标头

以前,“转换”标头的长度超过长字符串限制(默认值 1024) 到 a(实际上,它引用了实例的 )。 在输出时,此标头未转换(除非转换为字符串 - 例如,通过调用流)。​​DefaultMessagePropertiesConverter​​​​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​

有关详细信息,请参阅带批注的终结点方法签名。

入站用户标识

该属性不再映射到 。 此更改可避免在使用同一对象发送出站消息时意外传播。 相反,入站标头将映射到 。​​user_id​​​​MessageProperties.userId​​​​MessageProperties​​​​userId​​MessageProperties.receivedUserId

有关详细信息,请参阅消息属性转换器。

使用带批注的端点时,标头在名为 的标头中提供。AmqpHeaders.RECEIVED_USER_ID

有关详细信息,请参阅带批注的终结点方法签名。

RabbitAdmin变化
声明失败

以前,该标志仅在频道上生效(例如不匹配 参数)。 它现在对任何异常(如 )生效。 此外,现在每当声明失败时都会发布 a。 最后一个声明事件也可用作属性。 有关更多信息,请参阅配置代理。​​ignoreDeclarationFailures​​​​IOException​​​​TimeoutException​​​​DeclarationExceptionEvent​​​​RabbitAdmin​​​​lastDeclarationExceptionEvent​

​@RabbitListener​​变化
每个 bean 有多个容器

使用 Java 8 或更高版本时,现在可以向类添加多个注释或 他们的方法。 使用 Java 7 或更早版本时,可以使用容器注释来提供相同的 功能性。 有关详细信息,请参阅 @Repeatable @RabbitListener。@RabbitListener@Bean@RabbitListeners

@SendToSpEL 表达式

@SendTo对于没有属性的路由回复,现在可以根据 请求/回复。 有关详细信息,请参阅回复管理。replyTo

@QueueBinding改进

现在,您可以在注释中指定队列、交换和绑定的参数。 现在 支持标头交换。 有关详细信息,请参阅注释驱动的侦听器终结点。@QueueBinding@QueueBinding

延迟消息交换

Spring AMQP 现在对 RabbitMQ 延迟消息交换插件有一流的支持。 有关详细信息,请参阅延迟消息交换。

交易所内部标志

现在,任何定义都可以标记为 ,并在以下情况下将值传递给代理 声明交换。 有关更多信息,请参阅配置代理。​​Exchange​​​​internal​​​​RabbitAdmin​

​CachingConnectionFactory​​变化
​CachingConnectionFactory​​缓存统计信息

现在在运行时和通过 JMX 提供缓存属性。 有关详细信息,请参阅运行时缓存属性。​​CachingConnectionFactory​

访问底层 RabbitMQ 连接工厂

添加了一个新的 getter 以提供对基础工厂的访问。 例如,您可以使用此 getter 来添加自定义连接属性。 有关详细信息,请参阅添加自定义客户端连接属性。

通道缓存

默认通道缓存大小已从 1 增加到 25。 有关详细信息,请参阅连接和资源管理。

此外,不再调整缓存大小,使其至少与数字一样大 的 — 这是多余的,因为容器使用者通道永远不会缓存。​​SimpleMessageListenerContainer​​​​concurrentConsumers​

用​​RabbitConnectionFactoryBean​

工厂 Bean 现在公开一个属性,用于将客户机连接属性添加到由结果建立的连接 厂。

Java 反序列化

现在,您可以在使用 Java 反序列化时配置允许类的“允许列表”。 如果您接受来自 不受信任的来源。 有关更多信息,请参阅 Java 反序列化。

杰伦MessageConverter

对 JSON 消息转换器的改进现在允许使用没有类型信息的消息 在邮件头中。 有关详细信息,请参阅注释方法的消息转换和 Jackson2JsonMessageConverter。

日志记录追加程序
日志4j 2

添加了 log4j 2 追加器,现在可以为追加器配置一个属性进行连接 到代理集群。​​addresses​

客户端连接属性

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

有关详细信息,请参阅日志记录子系统 AMQP 追加程序。

C.2.12. 自 1.5 以来 1.4 的变化

​spring-erlang​​不再受支持

该 jar 不再包含在分发中。 请改用 RabbitMQ REST API。​​spring-erlang​

​CachingConnectionFactory​​变化
中的空地址属性​​CachingConnectionFactory​

以前,如果连接工厂配置了主机和端口,但还提供了空字符串,则忽略主机和端口。 现在,空字符串被视为与 相同,并使用主机和端口。​​addresses​​​​addresses​​​​null​

URI 构造函数

具有一个带有参数的附加构造函数,用于配置代理连接。​​CachingConnectionFactory​​​​URI​

连接重置

添加了一个名为的新方法,以允许用户重置连接(或多个连接)。 例如,您可以使用此选项在故障转移到辅助代理后重新连接到主代理。 这确实会影响进程内操作。 现有方法的作用完全相同,但新方法的名称不那么令人生畏。​​resetConnection()​​​​destroy()​

用于控制容器队列声明行为的属性

当侦听器容器使用者启动时,它们尝试被动声明队列以确保它们可用 在经纪人上。 以前,如果这些声明失败(例如,因为队列不存在)或 HA 队列正在 移动后,重试逻辑固定为以五秒间隔进行三次重试尝试。 如果队列仍然不存在,则行为由属性控制(默认值:)。 此外,对于配置为侦听多个队列的容器,如果只有队列子集可用,则使用者 以 60 秒的固定间隔重试丢失的队列。​​missingQueuesFatal​​​​true​

、 和 属性现在可以配置。 有关详细信息,请参阅消息侦听器容器配置。​​declarationRetries​​​​failedDeclarationRetryInterval​​​​retryDeclarationInterval​

类包更改

类已从 移至 。​​RabbitGatewaySupport​​​​o.s.amqp.rabbit.core.support​​​​o.s.amqp.rabbit.core​

​DefaultMessagePropertiesConverter​​变化

您现在可以将 确定转换的最大长度 到 a 而不是 a 。 转换器具有将值作为限制的替代构造函数。 以前,此限制以字节硬编码。 (在 1.4.4 中也可用)。​​DefaultMessagePropertiesConverter​​​​LongString​​​​String​​​​DataInputStream​​​​1024​

​@RabbitListener​​改进
​@QueueBinding​​为​​@RabbitListener​

该属性已添加到注释中,与属性互斥,以允许指定 、 其 和 用于通过 on 声明 经纪人。​​bindings​​​​@RabbitListener​​​​queues​​​​queue​​​​exchange​​​​binding​​​​RabbitAdmin​

SpEL in​​@SendTo​

的默认回复地址 () 现在可以是 SpEL 表达式。​​@SendTo​​​​@RabbitListener​

通过属性的多个队列名称

现在,您可以使用 SpEL 和属性占位符的组合为侦听器指定多个队列。

有关详细信息,请参阅注释驱动的侦听器终结点。

自动交换、队列和绑定声明

现在,您可以声明定义这些实体集合的 bean,并添加 建立连接时声明的实体列表的内容。 有关详细信息,请参阅声明交换、队列和绑定的集合。​​RabbitAdmin​

​RabbitTemplate​​变化
​reply-address​​添加

该属性已作为替代项添加到组件中。 有关详细信息,请参阅请求/回复消息。 (在 1.4.4 中也可作为 上的二传手提供)。​​reply-address​​​​<rabbit-template>​​​​reply-queue​​​​RabbitTemplate​

阻止方法​​receive​

现在支持阻止 in 和方法。 有关详细信息,请参阅轮询使用者。​​RabbitTemplate​​​​receive​​​​convertAndReceive​

强制使用方法​​sendAndReceive​

当使用 and 方法时设置标志时,调用线程 如果无法传递请求消息,则抛出 AW。 有关详细信息,请参阅回复超时。​​mandatory​​​​sendAndReceive​​​​convertSendAndReceive​​​​AmqpMessageReturnedException​

回复侦听器配置不正确

框架尝试在使用命名回复队列时验证回复侦听器容器的正确配置。

有关详细信息,请参阅回复侦听器容器。

RabbitManagementTemplate添加

引入了通过使用其管理插件提供的 REST API 来监控和配置 RabbitMQ 代理。 请参阅 RabbitMQ REST API 了解更多信息。​​RabbitManagementTemplate​

侦听器容器 Bean 名称 (XML)


元素上的属性已被删除。 从此版本开始,on the 子元素单独用于命名为每个侦听器元素创建的侦听器容器 Bean。​​id​​​​<listener-container/>​​​​id​​​​<listener/>​



应用正常的 Spring Bean 名称覆盖。 如果使用与现有 Bean 相同的方式解析更高版本,则新定义将覆盖现有定义。 以前,Bean 名称由 和 元素的属性组成。​​<listener/>​​​​id​​​​id​​​​<listener-container/>​​​​<listener/>​



迁移到此版本时,如果元素上有属性,请删除它们并改为在子元素上设置 。​​id​​​​<listener-container/>​​​​id​​​​<listener/>​


但是,为了支持以组的形式启动和停止容器,添加了一个新属性。 定义此属性后,此元素创建的容器将添加到具有此名称的 Bean 中,类型为 。 可以循环访问此组以启动和停止容器。​​group​​​​Collection<SimpleMessageListenerContainer>​

班级级别​​@RabbitListener​

现在可以在类级别应用注释。 与新方法注释一起,这允许您根据有效负载类型选择处理程序方法。 有关详细信息,请参阅多方法侦听器。​​@RabbitListener​​​​@RabbitHandler​

​SimpleMessageListenerContainer​​:退避支持

现在可以提供用于启动恢复的实例。 有关详细信息​​,请参阅消息侦听器容器配置​​。​​SimpleMessageListenerContainer​​​​BackOff​​​​consumer​

通道关闭日志记录

引入了一种控制通道关闭日志级别的机制。 请参阅​​记录通道关闭事件​​。

应用程序事件

现在,当使用者失败时发出应用程序事件。 有关详细信息,请参阅​​使用者事件​​。​​SimpleMessageListenerContainer​

消费者标记配置

以前,异步使用者的使用者标记由代理生成。 在此版本中,现在可以向侦听器容器提供命名策略。 请参阅使用者标记。

用​​MessageListenerAdapter​

现在支持队列名称(或消费者标记)到方法名称的映射,以确定 根据接收消息的队列调用哪个委托方法。​​MessageListenerAdapter​

​LocalizedQueueConnectionFactory​​添加

​LocalizedQueueConnectionFactory​​是连接到镜像队列实际驻留的群集中的节点的新连接工厂。

请参阅队列关联性和 LocalizedQueueConnectionFactory。

匿名队列命名

从版本 1.5.3 开始,您现在可以控制名称的生成方式。 有关详细信息,请参阅 AnonymousQueue。AnonymousQueue

C.2.13. 自 1.4 以来 1.3 的变化

@RabbitListener注解

POJO 侦听器可以使用 、 或 启用。 这个特性需要 Spring Framework 4.1。 有关详细信息,请参阅注释驱动的侦听器终结点。​​@RabbitListener​​​​@EnableRabbit​​​​<rabbit:annotation-driven />​

​RabbitMessagingTemplate​​添加

新增功能允许您使用实例与 RabbitMQ 进行交互。 在内部,它使用 ,您可以正常配置。 这个特性需要 Spring Framework 4.1。 有关详细信息,请参阅消息传递集成。​​RabbitMessagingTemplate​​​​spring-messaging​​​​Message​​​​RabbitTemplate​

侦听器容器属性​​missingQueuesFatal​

1.3.5 介绍了该属性。 这现在在侦听器容器命名空间元素上可用。 请参阅消息侦听器容器配置。​​missingQueuesFatal​​​​SimpleMessageListenerContainer​

兔子模板接口​​ConfirmCallback​

此接口上的方法具有一个名为 的附加参数。 如果可用,此参数包含否定确认 (nack) 的原因。 请参阅相关发布者确认和返回。​​confirm​​​​cause​

​RabbitConnectionFactoryBean​​添加

​RabbitConnectionFactoryBean​​创建 使用的底层 RabbitMQ 。 这允许使用 Spring 的依赖注入来配置 SSL 选项。 请参阅配置基础客户端连接工厂。​​ConnectionFactory​​​​CachingConnectionFactory​

用​​CachingConnectionFactory​

现在允许 被设置为命名空间中的属性或属性。 它在底层 RabbitMQ 上设置属性。 请参阅配置基础客户端连接工厂。​​CachingConnectionFactory​​​​connectionTimeout​​​​ConnectionFactory​

日志追加器

引入了回落。 它提供了类似于 的选项。 有关更多信息,请参阅这些类的 JavaDoc。​​org.springframework.amqp.rabbit.logback.AmqpAppender​​​​org.springframework.amqp.rabbit.log4j.AmqpAppender​

Log4j 现在支持属性 ( 或 , 默认值: )。 以前,所有 log4j 消息都是 。​​AmqpAppender​​​​deliveryMode​​​​PERSISTENT​​​​NON_PERSISTENT​​​​PERSISTENT​​​​PERSISTENT​

追加器还支持修改发送前的 — 例如,允许添加自定义标头。 子类应覆盖 .​​Message​​​​postProcessMessageBeforeSend()​

侦听器队列

现在,默认情况下,侦听器容器会在启动期间重新声明任何缺少的队列。 已向 中添加一个新属性以防止这些重新声明。 请参阅自动删除队列。​​auto-declare​​​​<rabbit:listener-container>​

​RabbitTemplate​​: 和表达式​​mandatory​​​​connectionFactorySelector​

、 和 SpEL 表达式的属性已添加到 中。 用于在使用 时根据每个请求消息评估布尔值。 请参阅相关发布者确认和返回。 在提供 时使用 和,以确定每个 AMQP 协议交互操作在运行时的目标。 请参阅路由连接工厂。​​mandatoryExpression​​​​sendConnectionFactorySelectorExpression​​​​receiveConnectionFactorySelectorExpression​​​​RabbitTemplate​​​​mandatoryExpression​​​​mandatory​​​​ReturnCallback​​​​sendConnectionFactorySelectorExpression​​​​receiveConnectionFactorySelectorExpression​​​​AbstractRoutingConnectionFactory​​​​lookupKey​​​​ConnectionFactory​

侦听器和路由连接工厂

您可以使用路由连接工厂配置 ,以根据队列名称启用连接选择。 请参阅路由连接工厂。​​SimpleMessageListenerContainer​

​RabbitTemplate​​:选择​​RecoveryCallback​

已添加该属性以在 中使用。 请参阅添加重试功能。​​recoveryCallback​​​​retryTemplate.execute()​

​MessageConversionException​​改变

此异常现在是 的子类。 请考虑以下代码:​​AmqpException​

try {
template.convertAndSend("thing1", "thing2", "cat");
}
catch (AmqpException e) {
...
}
catch (MessageConversionException e) {
...
}

第二个捕获块不再可访问,需要移动到捕获全部捕获块上方。​​AmqpException​

兔子MQ 3.4兼容性

Spring AMQP 现在与 RabbitMQ 3.4 兼容,包括直接回复。 有关详细信息,请参阅兼容性和 RabbitMQ 直接回复。

​ContentTypeDelegatingMessageConverter​​添加

已引入以根据 中的属性选择要使用的 。 有关详细信息,请参阅消息转换器。​​ContentTypeDelegatingMessageConverter​​​​MessageConverter​​​​contentType​​​​MessageProperties​

C.2.14. 自 1.3 以来 1.2 的变化

侦听器并发

侦听器容器现在支持根据工作负载动态缩放使用者数量,或者可以通过编程方式更改并发性,而无需停止容器。 请参阅侦听器并发。

侦听器队列

侦听器容器现在允许在运行时修改它侦听的队列。 此外,如果至少有一个已配置的队列可供使用,则容器现在将启动。 请参阅侦听器容器队列

此侦听器容器现在在启动期间重新声明任何自动删除队列。 请参阅自动删除队列。

消费者优先

侦听器容器现在支持使用者参数,允许设置参数。 请参阅使用者优先级。​​x-priority​

独家消费者

现在,您可以使用单个使用者进行配置,从而防止其他使用者侦听队列。 请参阅独家消费者。​​SimpleMessageListenerContainer​​​​exclusive​

兔子管理员

现在,您可以让代理生成队列名称,而不考虑 、 和设置。 请参阅配置代理。​​durable​​​​autoDelete​​​​exclusive​

直接交换绑定

以前,从配置的元素中省略属性会导致队列或交换绑定空字符串作为路由键。 现在,它与提供的 或 的名称绑定。 如果要使用空字符串路由密钥进行绑定,则需要指定 。​​key​​​​binding​​​​direct-exchange​​​​Queue​​​​Exchange​​​​key=""​

​AmqpTemplate​​变化

现在提供了几种同步方法。 这些由 . 有关更多信息,请参阅接收消息。​​AmqpTemplate​​​​receiveAndReply​​​​RabbitTemplate​

现在支持配置 a 以在代理不可用时尝试重试(使用可选的退避策略)。 有关详细信息,请参阅添加重试功能。​​RabbitTemplate​​​​RetryTemplate​

缓存连接工厂

现在,您可以将缓存连接工厂配置为缓存实例及其实例,而不是使用单个连接并仅缓存实例。 请参阅连接和资源管理。​​Connection​​​​Channel​​​​Channel​

绑定参数

的 现在支持子元素的解析。 您现在可以配置属性对(在单个标头上匹配)或子元素(允许在多个标头上匹配)的 。 这些选项是互斥的。 请参阅标头交换。​​<binding>​​​​<exchange>​​​​<binding-arguments>​​​​<binding>​​​​<headers-exchange>​​​​key/value​​​​<binding-arguments>​

路由连接工厂

引入了新的。 它允许配置映射,以确定在运行时使用的目标。 请参阅路由连接工厂。​​SimpleRoutingConnectionFactory​​​​ConnectionFactories​​​​ConnectionFactory​

​MessageBuilder​​和​​MessagePropertiesBuilder​

现在提供了用于构建消息或消息属性的“Fluent API”。 请参阅消息生成器 API。

​RetryInterceptorBuilder​​改变

现在提供了一个“Fluent API”,用于构建侦听器容器重试拦截器。 请参阅同步操作中的失败和重试选项。

​RepublishMessageRecoverer​​添加

提供此新功能是为了允许在重试用尽时将失败的消息发布到另一个队列(包括标头中的堆栈跟踪信息)。 请参阅消息侦听器和异步案例。​​MessageRecoverer​

默认错误处理程序(自 1.3.2 起)

默认值已添加到侦听器容器中。 此错误处理程序检测致命的消息转换问题,并指示容器拒绝消息,以防止代理不断重新传递不可转换的消息。 请参阅异常处理。​​ConditionalRejectingErrorHandler​

侦听器容器“缺少队列致命”属性(自 1.3.5 起)

现在有一个名为 (默认: ) 的属性。 以前,缺少队列总是致命的。 请参阅消息侦听器容器配置。​​SimpleMessageListenerContainer​​​​missingQueuesFatal​​​​true​

C.2.15. 自 1.2 以来对 1.1 的更改

兔子MQ版本

Spring AMQP 现在默认使用 RabbitMQ 3.1.x(但保留了与早期版本的兼容性)。 对于 RabbitMQ 3.1.x 不再支持的功能(联合交换和 上的属性),添加了某些弃用。​​immediate​​​​RabbitTemplate​

兔子管理员

​RabbitAdmin​​现在提供了一个选项,允许交换、排队和绑定声明在声明失败时继续。 以前,所有声明都会在失败时停止。 通过设置 ,将记录此类异常(在级别),但进一步的声明将继续。 这可能有用的一个示例是,当队列声明由于通常会阻止其他声明继续的略有不同的设置而失败时。​​ignore-declaration-exceptions​​​​WARN​​​​ttl​

​RabbitAdmin​​现在提供了一个名为 的附加方法。 您可以使用它来确定代理上是否存在队列(返回不存在的队列)。 此外,它还返回队列中的当前消息数以及当前使用者数。​​getQueueProperties()​​​​null​

兔子模板

以前,当这些方法与固定回复队列一起使用时,两个自定义标头用于关联数据以及保留和还原回复队列信息。 在此版本中,默认情况下使用标准消息属性 (),但您可以指定要使用的自定义属性。 此外,嵌套信息现在保留在模板内部,而不是使用自定义标头。​​…sendAndReceive()​​​​correlationId​​​​replyTo​

该属性已弃用。 使用 RabbitMQ 3.0.x 或更高版本时,不得设置此属性。​​immediate​

JSON 消息转换器

现在提供了杰克逊 2.x,以及使用杰克逊 1.x 的现有转换器。​​MessageConverter​

自动申报队列和其他项目

以前,在声明队列、交换和绑定时,无法定义用于声明的连接工厂。 每个组件都使用其连接声明了所有组件。​​RabbitAdmin​

从此版本开始,您现在可以将声明限制为特定实例。 请参阅条件声明。​​RabbitAdmin​

AMQP 远程处理

现在提供了使用 Spring 远程处理技术的工具,使用 AMQP 作为 RPC 调用的传输。 有关详细信息,请参阅远程处理

请求的心跳

一些用户要求在Spring AMQP上公开底层客户端连接工厂的属性。 这现已可用。 以前,需要将 AMQP 客户机工厂配置为单独的 Bean,并在 中提供对它的引用。​​requestedHeartBeats​​​​CachingConnectionFactory​​​​CachingConnectionFactory​

C.2.16. 自 1.1 以来对 1.0 的更改

常规

Spring-AMQP现在由Gradle构建。

添加对发布商确认和返回的支持。

添加对 HA 队列和代理故障转移的支持。

添加对死信交换和死信队列的支持。

AMQP Log4j Appender

添加一个选项以支持向记录的消息添加消息 ID。

添加一个选项,以允许在转换为 时使用名称规范。​​Charset​​​​String​​​​byte[]​