<appendixc:changehistory/>
This section describes changes that have been made as versions have changed.
C.1. 当前版本
查看 最新动态。
C.2. Previous Releases
C.2.1. 从 2.3 到 2.4 的变化
此部分介绍了从版本2.3到版本2.4的变化。请查看更改历史记录了解之前版本中的更改。
@RabbitListener变更
MessageProperties 现在可用于参数匹配。有关更多信息,请参阅 带注解的端点方法签名。
RabbitAdmin变更
一个新属性recoverManualDeclarations允许恢复手动声明的队列/交换机/绑定。
请参阅恢复自动删除声明了解有关更多信息。
C.2.2. 消息转换器更改
The Jackson2JsonMessageConverter 可以现在从 contentEncoding 头部确定字符集。
参见 Jackson2JsonMessageConverter 以获取更多信息。
C.2.3。消息转换器更改
The Jackson2JsonMessageConverter 可以现在从 contentEncoding 头部确定字符集。
参见 Jackson2JsonMessageConverter 以获取更多信息。
C.2.4. 流支持更改
RabbitStreamOperations and RabbitStreamTemplate 已弃用,分别代之以 RabbitStreamOperations2 和 RabbitStreamTemplate2,它们返回 CompletableFuture 而不是 ListenableFuture。
请参阅使用RabbitMQ流插件以了解更多信息。
C.2.5. 在 2.3 中的变更 从 2.2
@RabbitListener变更
你现在可以指定回复内容类型。 请参阅 ReplyContentType 以获取更多信息。
测试更改
一个新的注解 @SpringRabbitTest 提供用于在不使用 SpringBootTest 的情况下自动配置一些基础设施 bean。
查看 @SpringRabbitTest 以获取更多信息。
RabbitTemplate 变更
该模板的 ReturnCallback 已重构为 ReturnsCallback,以便更简单地在 lambda 表达式中使用。
见 相关发布者确认和返回 以获取更多信息。
使用退货和相关的确认时,现在需要一个唯一的CorrelationData属性。
请参阅相关的发布者确认和退货以了解更多信息。
监听器容器变更
现在新增了一个监听器容器属性 consumeDelay;当使用 RabbitMQ 分片插件 时,该属性非常有用。
默认的 JavaLangErrorHandler 现在调用 System.exit(99)。要恢复到之前的 behaviour(即不执行任何操作),请添加一个空操作处理器。
容器现在支持 globalQos 属性,以便将 prefetchCount 全局应用于通道,而非每个通道上的消费者。
见 消息监听器容器配置 以获取更多信息。
MessagePostProcessor 的更改
压缩的 MessagePostProcessor 现在使用逗号而不是冒号来分隔多个内容编码。
解压器可以处理这两种格式,但是,如果你用这个版本生成的消息被早于2.2.12版本的程序消费,你应该配置压缩器使用旧的分隔符。
有关更多信息,请参阅修改消息 - 压缩与更多中的重要说明。
多代理支持改进
请参阅多个代理(或群集)支持了解更多信息。
RepublishMessageRecoverer Changes
一个不支持发布者确认的新recoverer子类并未提供。见 消息监听器与异步情形 以获取更多信息。
C.2.6. 从 2.1 升级到 2.2 的更改<br />
本节描述了版本 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) 现在是可选依赖项,将不再作为传递依赖项出现。
模块 spring-rabbit-junit 现在作为 编译 依赖项包含在模块 spring-rabbit-test 中,以便在仅使用单一 spring-rabbit-test 的情况下,为 AMQP 组件提供完整的测试工具集,从而提升目标应用的开发体验。
“突破性” API 变更
JUnit(5)RabbitAvailableCondition.getBrokerRunning()现在返回一个BrokerRunningSupport实例而不是BrokerRunning,这依赖于JUnit 4。
它具有相同的API,因此只需要更改任何引用的类名。
JUnit5 Conditions查看更多信息。
监听器容器变更
消息如果带有致命异常,现在会被拒绝且不会重新排队,即使确认模式是手动的也不例外。有关更多信息,请参阅异常处理。
监听器性能现在可以使用 Micrometer 监控。
Timer秒。
请参阅 监控监听器性能 以了解更多信息。
@RabbitListener 变更
You can now configure an executor on each listener, overriding the factory configuration, to more easily identify threads associated with the listener.
You can now override the container factory’s acknowledgeMode property with the annotation’s ackMode property.
See overriding container factory properties for more information。
当使用 批处理 时,@RabbitListener 个方法现在可以在一次调用中接收完整的消息批次,而不再逐个获取消息。
在逐个接收批处理消息时,最后一则消息的 isLastInBatch 消息属性被设置为 true。
此外,现在接收到的批量消息包含 amqp_batchSize 头部。
监听器也可以消耗在SimpleMessageListenerContainer中创建的批处理,即使不是由生产者创建的批处理。有关更多信息,请参阅选择容器。
Spring Data 抽象类现在由 Jackson2JsonMessageConverter 支持。请参阅 使用 Spring Data 抽象类接口 了解更多信息。
The Jackson2JsonMessageConverter now assumes the content is JSON if there is no contentType property, or it is the default (application/octet-string).
See Converting from a Message for more information.
同样。如果不存在contentType属性,或者它是默认值application/octet-string,则Jackson2XmlMessageConverter现在假定内容是XML。
请参阅Jackson2XmlMessageConverter了解更多相关信息。
当 @RabbitListener 方法返回结果时,bean 和 Method 现在都可在回复消息属性中获得。
这允许配置 beforeSendReplyMessagePostProcessor,例如在回复中设置一个头以指示服务器上被调用的方法。
有关更多信息,请参阅 Reply Management。
您可以现在配置一个ReplyPostProcessor,对回复消息进行修改后再发送。有关更多信息,请参阅回复管理。
AMQP 日志追加器变更
Log4J 和 Logback 的 AmqpAppender 版本现在支持 verifyHostname SSL 选项。
此外,这些附加组件现在可以配置为不将 MDC 条目作为请求头添加。addMdcAsHeaders 布尔选项已引入,用于配置此类行为。
附加组件现在支持 SaslConfig 属性。
有关更多信息,请参见Logging Subsystem AMQP Appenders。
MessageListenerAdapter 的更改
提供新的方法来构建要传递给目标侦听器的参数数组,旧的方法已过时。有关更多信息,请参阅BeanPostProcessorOrderComparator。
交换器/队列声明变更
用于创建声明由RabbitAdmin使用的Exchange和Queue对象的ExchangeBuilder和QueueBuilderfluent API现在现在支持“众所周知”的参数。有关更多信息,请参阅Builder API for Queues and Exchanges。
The RabbitAdmin has a new property explicitDeclarationsOnly.
See Conditional Declaration for more information.
连接工厂变更
CachingConnectionFactory 有一个新属性 shuffleAddresses。
提供一个代理节点地址列表时,该列表在创建连接之前会被打乱,以便尝试连接的顺序是随机的。
有关更多信息,请参阅连接到群集。
当使用发布者确认和返回时,现在在连接工厂上调用回调executor。
这避免了从库内部执行rabbit操作时可能出现的死锁1。
有关更多信息,请参阅
此外,发布者确认类型现在通过 ConfirmType 枚举指定,而不是通过两种互斥的setter方法。
代码 0 现在在启用 SSL 时默认使用 TLS 1.2。 有关更多信息,请参阅 代码 2 和配置 SSL。
其他变更
Declarables 对象(用于声明多个队列、交换机、绑定)现在为每种类型提供了筛选器 getter。
请参阅声明集合交换机、队列和绑定了解有关更多信息。
singleActiveConsumer() 已添加到 QueueBuilder 以设置 x-single-active-consumer 队列参数。
查看 队列和交换器构建器API 以获取更多信息。
带有值类型为Class<?>的出站标头现在使用getName()而不是toString()进行映射。有关更多信息,请参阅消息属性转换器。
已支持失败的生产者创建批处理的恢复。请参阅重试使用批处理监听器\"了解更多信息。
C.2.7. 从 2.1 版到 2.0 的变化
AMQP 客户端库
Spring AMQP 现在使用 RabbitMQ 团队提供的 0 库的 5.4.x 版本。 此客户端默认配置了自动恢复。 见 RabbitMQ 自动连接/拓扑恢复。
截至 4.0 版本,客户端默认启用自动恢复功能。虽然与该功能兼容,但 Spring AMQP 自身也具备恢复机制,因此客户端的自动恢复功能通常并不需要启用。我们建议禁用 amqp-client 自动恢复功能,以避免在代理服务可用但连接尚未恢复时出现 AutoRecoverConnectionNotCurrentlyOpenException 个实例。从 1.7.1 版本开始,Spring AMQP 默认禁用此功能,除非您显式创建自己的 RabbitMQ 连接工厂并将其提供给 CachingConnectionFactory。由 RabbitConnectionFactoryBean 创建的 RabbitMQ ConnectionFactory 实例也默认禁用该选项。 |
包变更
某些类已移动到不同的包中。
大多数是内部类,不会影响用户应用程序。
有两个例外: ChannelAwareMessageListener 和 RabbitListenerErrorHandler。
这些接口现在位于 org.springframework.amqp.rabbit.listener.api。
发布者确认更改
已启用发布确认的通道在存在挂起的确认期间不会返回到缓存中。请参阅相关的发布确认和返回以了解详细信息。
经纪人事件监听器
引入了BrokerEventListener来作为ApplicationEvent实例,发布选定的代理事件。有关更多信息,请参阅代理事件侦听器。
RabbitAdmin 变更
RabbitAdmin 可以发现类型为Declarables的 bean(其中包括Declarable-Queue、Exchange和Binding对象),并将这些包含的对象声明为代理。
建议用户不要使用旧机制来声明<Collection<Queue>>(和其他一些)Declarables bean,而应改用Declarables bean代替它。默认情况下,旧机制是禁用的。有关更多信息,请参阅声明交换、队列和绑定的集合。
AnonymousQueue 的实例现在默认设置为x-queue-master-locator,并设置为client-local,以确保队列在应用程序连接到的节点上创建。 有关更多信息,请参阅配置代理。
RabbitTemplate 变更
您可以使用RabbitTemplate选项为noLocalReplyConsumer操作中的答复使用者配置noLocal标志。
有关更多信息,请参阅请求/答复消息传递。
CorrelationData 用于发布确认现在有一个 ListenableFuture,您可以使用它获取确认而不是使用回调。
当返回和确认被启用时,如果提供相关数据,则会用返回的消息填充该数据。
有关更多信息,请参阅相关发布确认和返回。
一个名为replyTimedOut的方法现在提供给子类,用于通知其回复已超时,允许进行任何状态清理。
查看Reply Timeout以获取更多信息。
现在,您可以在使用请求/回复(request/reply)时指定一个 ErrorHandler,当使用 DirectReplyToMessageListenerContainer(默认值)时,在回复传递过程中发生异常(例如,延迟回复)的情况下被调用。请参阅 setReplyErrorHandler 中的 RabbitTemplate。 (自 2.0.11 版本起也支持此功能)。
消息转换
我们引入了一个新的Jackson2XmlMessageConverter来支持将消息转换为XML格式。
请参阅Jackson2XmlMessageConverter获取更多信息。
管理 REST API
当前 RabbitManagementTemplate 已被弃用,建议直接使用 com.rabbitmq.http.client.Client(或 com.rabbitmq.http.client.ReactorNettyClient)。
有关更多信息,请参阅RabbitMQ REST API。
@RabbitListener变更
监听器容器工厂现在可以配置RetryTemplate,并在发送回复时选择性地使用RecoveryCallback。有关更多信息,请参阅启用监听器端点注释。
异步@RabbitListener返回
@RabbitListener 方法现在可以返回 ListenableFuture<?> 或 Mono<?>。
有关更多信息,请参阅异步 @RabbitListener 返回类型。
连接工厂 Bean 变更
默认情况下,RabbitConnectionFactoryBean 现在会调用 enableHostnameVerification()。要恢复到以前的行为,请将 enableHostnameVerification 属性设置为 false。
连接工厂变更
代码CachingConnectionFactory现在无条件禁用底层 RabbitMQ ConnectionFactory 的自动恢复功能,即使在构造函数中提供了预配置的实例也是如此。虽然已采取措施使 Spring AMQP 与自动恢复兼容,但仍出现某些边界情况导致问题依然存在。Spring AMQP 自 1.0.0 版本起便拥有自己的恢复机制,无需依赖客户端提供的恢复功能。尽管在 CachingConnectionFactory 构造完成后仍有可能启用该功能(通过 cachingConnectionFactory.getRabbitConnectionFactory() 和 .setAutomaticRecoveryEnabled()),但我们强烈建议您不要这样做。如果您需要在直接使用客户端工厂时启用自动恢复连接,请考虑使用独立的 RabbitMQ ConnectionFactory(而非使用 Spring AMQP 组件)。
监听器容器变更
默认情况下,如果存在x-death标头,则当出现导致致命错误的消息时,ConditionalRejectingErrorHandler会完全丢弃这些消息。有关详细信息,请参阅异常处理。
立即重新入队
引入了一个新的 ImmediateRequeueAmqpException,用于通知监听器容器该消息需要重新入队。
要使用此功能,需添加一个新的 ImmediateRequeueMessageRecoverer 实现。
有关更多信息,请参阅消息监听器和异步情况。
C.2.8. 从1.7到2.0的变化
使用CachingConnectionFactory
从版本 2.0.2 开始,您可以配置 RabbitTemplate 使用与监听器容器不同的连接。这可以避免因生产者被阻止而引起的死锁消费者问题。使用单独的连接了解更多信息。
AMQP 客户端库
Spring AMQP 现在使用由 RabbitMQ 团队提供的 amqp-client 库的新 5.0.x 版本。该客户端默认配置了自动恢复功能。参见RabbitMQ 自动连接/拓扑恢复。
| 从 4.0 版本开始,客户端默认启用了自动恢复功能。 虽然与该功能兼容,但 Spring AMQP 自身也具备恢复机制,通常无需使用客户端的恢复功能。 我们建议禁用 从 1.7.1 版本开始,Spring AMQP 默认禁用该功能,除非您显式创建自己的 RabbitMQ 连接工厂并将其提供给 RabbitMQ |
常规变更
现在,默认情况下,ExchangeBuilder构建持久交换。@Exchange注解在@QeueueBinding内使用时,默认也声明持久exchange。@Queue注解用于@RabbitListener中,默认情况下如果命名则声明持久队列,如果是匿名则非持久。有关更多信息,请参阅队列和Exchange的Builder API和基于注解的监听端点。
删除的类
UniquelyNameQueue 已不再提供。
以唯一名称创建持久化且非自动删除的队列是不常见的。
此类已删除。
如果您需要其功能,请使用 new Queue(UUID.randomUUID().toString())。
Log4j Appender
此附加程序已不可用,因为 log4j 已停止维护。 有关可用日志附加程序的信息,请参阅 Logging Subsystem AMQP Appenders。
RabbitTemplate变更
之前,非事务性的 RabbitTemplate 若在事务性监听器容器线程上运行,则会参与现有事务。这是一个严重错误。然而,用户可能已依赖此行为。从 1.6.2 版本开始,您必须在模板上设置 channelTransacted 的布尔值,才能使其参与容器事务。 |
当前 RabbitTemplate 使用 DirectReplyToMessageListenerContainer(默认情况下)而不是为每个请求创建新的消费者。
有关详细信息,请参阅RabbitMQ Direct reply-to。
现在,AsyncRabbitTemplate支持直接回复。异步Rabbit模板获取更多信息。
现在,RabbitTemplate 和 AsyncRabbitTemplate 具有接受 ParameterizedTypeReference<T> 参数的 receiveAndConvert 和 convertSendAndReceiveAsType 方法,允许调用者指定要转换为的结果类型。
这对于复杂类型或在消息头中未传递类型信息时尤其有用。
需要一个 SmartMessageConverter(如 Jackson2JsonMessageConverter)。
有关更多信息,请参阅接收消息、请求/回复消息传递、异步 Rabbit 模板以及使用 RabbitTemplate 从 Message 转换。
现在,您可以使用一个 RabbitTemplate 在专用通道上执行多个操作。
有关更多信息,请参阅范围操作。
监听器适配器
使用 lambda 表达式的便捷 FunctionalInterface 已经可用,详情请参阅 MessageListenerAdapter。
监听器容器变更
预取默认值
预取默认值曾为1,这可能导致高效消费者未被充分利用。当前默认预取值为250,这在大多数常见场景中应能保持消费者的忙碌状态,从而提升吞吐量。
| 在某些场景下,预取值应设置得较低——例如,当消息较大时,尤其是处理速度较慢(消息可能在客户端进程中累积成大量内存),并且需要严格的消息顺序时(此时应将预取值重置为1)。</p><p>此外,在低频消息传递且存在多个消费者(包括单个监听容器实例内的并发)的情况下,您可能希望降低预取值,以实现消息在各消费者之间更均衡的分配。 |
有关预取的更多背景信息,请参阅这篇关于 RabbitMQ 中消费者利用率 的文章,以及这篇关于 排队论 的文章。
消息数量
之前,MessageProperties.getMessageCount() 对由容器发出的消息返回 0。此属性仅在使用 basicGet(例如从 RabbitTemplate.receive() 方法中)时适用,并且现在已初始化为 null,用于容器消息。
事务回滚行为
事务回滚时重新排队消息现在是一致的,无论是否配置了事务管理器。
有关更多信息,请参阅关于接收到的消息回滚的说明。
关闭行为
如果容器线程在shutdownTimeout内不响应关机,则默认强制关闭通道。请参阅消息监听器容器配置以获取更多信息。
连接工厂变更
连接和通道监听器接口现在提供了一种机制来获取异常信息。连接和通道侦听器 和 发布是异步的——如何检测成功和失败以了解更多信息。
现在提供了一个新的ConnectionNameStrategy,用于从AbstractConnectionFactory填充目标RabbitMQ连接的应用程序特定标识。连接和资源管理了解更多信息。
重试更改
不再提供MissingMessageIdAdvice。其功能现在已内置。有关更多信息,请参阅同步操作中的失败及重试选项。
匿名队列命名
默认情况下,AnonymousQueues 现在使用默认的 Base64UrlNamingStrategy 命名,而不是简单的 UUID 字符串。
有关更多信息,请参阅 AnonymousQueue。
@RabbitListener变更
现在,您可以在@RabbitListener注解中提供简单的队列声明(仅绑定到默认交换)。有关更多信息,请参阅基于注解的监听端点。
您可以现在配置 @RabbitListener 注解,以便任何异常都会被返回给发送者。
您也可以配置一个 RabbitListenerErrorHandler 来处理异常。
处理异常 以获取更多信息。
现在,您可以使用 @QueueBinding 注解将队列与多个路由键绑定。
此外,@QueueBinding.exchange() 现在支持自定义交换机类型,并默认声明持久化交换机。
现在,您可以在注解级别设置监听器容器的 concurrency,而无需为不同的并发设置配置不同的容器工厂。
现在,您可以在注解级别设置监听器容器的 autoStartup 属性,从而覆盖容器工厂中的默认设置。
现在,您可以在 RabbitListener 容器工厂中设置接收后和发送(回复)前的 MessagePostProcessor 个实例。
有关更多详细信息,请参阅基于注解的监听器端点。
从版本 2.0.3 开始,类级别的 @RabbitHandler 注解中的一个可以被指定为默认值。
多方法监听器 了解更多信息。
容器条件回滚
使用外部事务管理器(例如JDBC)时,如果您向容器提供事务属性,则现在支持基于规则的回滚。当您使用事务通知时,它也变得更加灵活。有关更多信息,请参阅条件回滚。
移除 Jackson 1.x 支持
在以前的版本中已弃用,Jackson 1.x 转换器及相关组件现已删除。您可以使用基于 Jackson 2.x 的类似组件。有关更多信息,请参阅Jackson2JsonMessageConverter。
JSON 消息转换器
当传入的 JSON 消息中 TypeId 设置为 Hashtable 时,默认转换类型现在变为 LinkedHashMap。此前,该值为 Hashtable。若要恢复为 Hashtable,您可在 DefaultClassMapper 上使用 setDefaultMapType。
XML 解析器
在解析 Queue 和 Exchange XML 组件时,如果存在 id 属性,则解析器不再将 name 属性值注册为 Bean 别名。有关更多信息,请参阅 A Note On the id and name Attributes。
连接被阻止
现在您可以将 com.rabbitmq.client.BlockedListener 注入到 org.springframework.amqp.rabbit.connection.Connection 对象中。
此外,当连接因 Broker 而被阻塞或解除阻塞时,ConnectionBlockedEvent 和 ConnectionUnblockedEvent 事件由 ConnectionFactory 发出。
有关更多详细信息,请参阅连接和资源管理。
C.2.9. 版本 1.7 相较于 1.6 的变更
AMQP 客户端库
Springs AMQP 现在使用 RabbitMQ 团队提供的 amqp-client 库的新 4.0.x 版本。此客户端默认配置了自动恢复功能。请参阅 RabbitMQ 自动连接/拓扑恢复。
4.0.x 客户端默认启用自动恢复功能。虽然与该功能兼容,但 Spring AMQP 自身也具有其恢复机制,客户端的恢复功能通常并不需要。我们建议禁用 amqp-client 自动恢复功能,以避免在代理可用但连接尚未恢复时出现 AutoRecoverConnectionNotCurrentlyOpenException 个实例。从版本 1.7.1 开始,Spring AMQP 默认禁用该功能,除非您显式创建自己的 RabbitMQ 连接工厂并将其提供给 CachingConnectionFactory。由 RabbitConnectionFactoryBean 创建的 RabbitMQ ConnectionFactory 实例也默认禁用该选项。 |
Log4j 2 升级
Log4j 2 的最低版本(对于 AmqpAppender)现在是 2.7。
框架不再与以前的版本兼容。
有关更多信息,请参阅日志子系统AMQP追加器。
Logback Appender
此追加器默认不再捕获调用者数据(方法、行号)。您可以通过设置includeCallerData配置选项重新启用它。有关可用日志追加器的信息,请参阅Logging Subsystem AMQP Appenders。
Spring 重试升级
最低 Spring 重试版本现已为 1.2。该框架不再与旧版本兼容。
关闭行为
现在,您可以将 forceCloseChannel 设置为 true,以便在容器线程没有响应关闭请求超过 shutdownTimeout 秒时,强制关闭通道,导致任何未确认的消息重新排队。有关更多信息,请参阅 消息监听器容器配置。
JUnit@Rules
之前由框架内部使用的规则现已作为独立的 jar 包 spring-rabbit-junit 提供。
有关更多信息,请参见 JUnit4 @Rules。
连接命名策略
现在提供了一个新的ConnectionNameStrategy,用于从AbstractConnectionFactory填充目标RabbitMQ连接的应用程序特定标识。连接和资源管理了解更多信息。
监听器容器变更
事务回滚行为
现在,您可以配置在事务回滚时重新排队消息,无论是否配置了事务管理器,行为都是一致的。
有关详细信息,请参阅关于收到的消息回滚的一点说明。
C.2.10. 早期版本
请参阅之前的版本,了解以前版本的更改。
C.2.11. 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: 带超时的接收
已为 AmqpTemplate 及其 RabbitTemplate 实现引入了若干新的 receive() 方法,这些方法具有 timeout。有关详细信息,请参阅轮询消费者。
使用AsyncRabbitTemplate
新引入了AsyncRabbitTemplate。此模板提供了多种发送和接收方法,返回值为ListenableFuture,稍后可使用该返回值同步或异步获取结果。异步Rabbit模板了解更多信息。
RabbitTemplate变更
1.4.1 版本引入了在代理支持时使用直接回复到的功能。当每个回复都使用临时队列时,它比使用临时队列更高效。此版本允许您覆盖默认行为,并通过将useTemporaryReplyQueues属性设置为true来使用临时队列。RabbitMQ 直接回复到了解更多信息。
现在,RabbitTemplate 支持 user-id-expression(使用 Java 配置时为 userIdExpression)。有关更多信息,请参阅经过验证的用户 ID RabbitMQ 文档 和 已验证的用户 ID。
消息属性
使用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 对象的消息,应考虑创建一个允许列表。有关更多信息,请参阅 Java 反序列化。
JSONMessageConverter
对 JSON 消息转换器的改进现在允许消费消息头中不包含类型信息的消息。请参阅 带注释方法的消息转换 和 Jackson2JsonMessageConverter 了解更多信息。
C.2.12. 版本 1.5 相较于 1.4 的更改
spring-erlang已不再受支持
文件 spring-erlang jar 已不再包含在发行版中。
请改用 RabbitMQ REST API。
CachingConnectionFactory变更
控制容器队列声明行为的属性
当监听器容器消费者启动时,它们会尝试被动声明队列,以确保这些队列在代理上可用。之前,如果这些声明失败(例如,因为队列不存在)或在高可用性(HA)队列迁移过程中,重试逻辑固定为在五秒间隔下进行三次重试。如果队列仍然不存在,则由 missingQueuesFatal 属性控制其行为(默认值:true)。此外,对于配置为从多个队列监听的容器,若仅部分队列可用,消费者将按固定的 60 秒间隔重试缺失的队列。
属性 declarationRetries、failedDeclarationRetryInterval 和 retryDeclarationInterval 现在可配置。有关详细信息,请参阅消息监听容器配置。
类包变更
The RabbitGatewaySupport class has been moved from o.s.amqp.rabbit.core.support to o.s.amqp.rabbit.core.
DefaultMessagePropertiesConverter变更
现在,您可以配置 DefaultMessagePropertiesConverter 来确定将 LongString 转换为 String 还是 DataInputStream 的最大长度。
转换器提供了一个可接受限制值作为参数的备选构造函数。
此前,该限制值被硬编码为 1024 字节。
(同样适用于 1.4.4 版本)。
@RabbitListener改进
自动交换、队列和绑定声明
现在,您可以声明定义这些实体集合的 bean,并且在建立连接时,RabbitAdmin 将其内容添加到它所声明的实体列表中。
有关更多信息,请参阅声明交换、队列和绑定的集合。
RabbitTemplate变更
reply-address添加
属性reply-address已被添加到组件<rabbit-template>中,作为替代reply-queue。请求/回复消息传递可以获取更多相关信息。(在1.4.4版本中也可通过RabbitTemplate上的setter方法获得)。
阻塞receive方法
当前 RabbitTemplate 已经支持在 receive 和 convertAndReceive 方法中进行阻塞。
详情请参见轮询消费者。
必填项sendAndReceive方法
当使用 mandatory 和 sendAndReceive 方法时,如果设置了 convertSendAndReceive 标志,则调用线程会抛出 AmqpMessageReturnedException 异常,如果无法传递请求消息。有关更多信息,请参阅 回复超时。
RabbitManagementTemplate添加
通过使用其管理插件提供的REST API,已引入RabbitManagementTemplate来监控和配置RabbitMQ代理。有关更多信息,请参见RabbitMQ REST API。
监听器容器 Bean 名称(XML)
|
元素上的 正常的 Spring Bean 名称覆盖规则将被应用。如果后续解析的 在迁移到此版本时,如果您在 |
然而,为了支持以组为单位启动和停止容器,新增了一个 group 属性。当此属性被定义时,由该元素创建的容器将被添加到一个名称为此的 Bean 中,其类型为 Collection<SimpleMessageListenerContainer>。您可以遍历该组来启动和停止容器。
类级别@RabbitListener
现在可以在类级别应用@RabbitListener注解。
与新的@RabbitHandler方法注解一起,这使您可以根据有效负载类型选择处理程序方法。
多方法监听器以获取更多信息。
SimpleMessageListenerContainer: 重试支持
现在可以在 SimpleMessageListenerContainer 中提供一个 BackOff 实例用于 consumer 启动恢复。有关更多信息,请参阅消息监听容器配置。
应用程序事件
当消费者失败时,SimpleMessageListenerContainer 现在会发出应用程序事件。有关详细信息,请参阅消费者事件。
消费者标签配置
以前,异步消费者的消费者标记是由代理生成的。此版本中,现在可以向监听器容器提供命名策略。消费者标记。
匿名队列命名
从1.5.3版本开始,现在您可以控制AnonymousQueue名称的生成方式。更多详细信息,请参见AnonymousQueue。
C.2.13. 版本从1.4到1.3的变化
@RabbitListener注解
可以使用@RabbitListener注解POJO监听器,并通过@EnableRabbit或<rabbit:annotation-driven />启用。此功能需要Spring Framework 4.1。基于注解的监听器端点了解更多信息。
RabbitMessagingTemplate添加
新的 RabbitMessagingTemplate 允许您通过使用 spring-messaging Message 实例与 RabbitMQ 进行交互。内部,它使用了 RabbitTemplate,您可以像平常一样进行配置。此功能需要 Spring Framework 4.1。消息集成了解更多信息。
监听器容器missingQueuesFatal属性
1.3.5 在 SimpleMessageListenerContainer 上引入了 missingQueuesFatal 属性。
现在该属性可在监听器容器命名空间元素上使用。
消息监听器容器配置
RabbitTemplateConfirmCallback接口
此接口上的 confirm 方法有一个额外的参数,称为 cause。当可用时,该参数包含负面确认(nack)的原因。参见 关联发布者确认和返回。
RabbitConnectionFactoryBean添加
RabbitConnectionFactoryBean 创建了 Spring 框架用于 ConnectionFactory 的底层 RabbitMQ CachingConnectionFactory。这使得可以使用 Spring 的依赖注入配置 SSL 选项。参见 配置底层客户端连接工厂。
使用CachingConnectionFactory
现在,CachingConnectionFactory 允许在命名空间中将 connectionTimeout 设置为属性或属性。
它会在底层 RabbitMQ ConnectionFactory 上设置属性。
配置底层客户端连接工厂
日志追加器
Logback org.springframework.amqp.rabbit.logback.AmqpAppender 版本已引入。
它提供了与 org.springframework.amqp.rabbit.log4j.AmqpAppender 类似的选项。
有关更多信息,请参阅这些类的 JavaDoc 文档。
Log4j AmqpAppender 现在支持 deliveryMode 属性(PERSISTENT 或 NON_PERSISTENT,默认值为 PERSISTENT)。
此前,所有 Log4j 日志消息均被 PERSISTENT。
附加程序还支持在发送前修改 Message —— 例如,允许添加自定义头信息。
子类应重写 postProcessMessageBeforeSend()。
监听器队列
监听器容器现在默认会在启动时重新声明任何缺失的队列。auto-declare属性已添加到<rabbit:listener-container>中,以防止这些重新声明。参见auto-delete 队列。
RabbitTemplate: mandatory和connectionFactorySelector表达式
表达式语言 (SpEL) 的属性 mandatoryExpression、sendConnectionFactorySelectorExpression 和 receiveConnectionFactorySelectorExpression 已添加到 RabbitTemplate。
当使用 ReturnCallback 时,mandatoryExpression 用于对每个请求消息评估 mandatory 布尔值。
关联发布者确认和返回。
当提供 AbstractRoutingConnectionFactory 时,sendConnectionFactorySelectorExpression 和 receiveConnectionFactorySelectorExpression 用于在每次 AMQP 协议交互操作时确定目标 ConnectionFactory 的运行时 lookupKey。
路由连接工厂。
监听器和路由连接工厂
您可以配置一个SimpleMessageListenerContainer与路由连接工厂,以基于队列名称启用连接选择。
参见路由连接工厂。
RabbitTemplate: RecoveryCallback选项
属性 recoveryCallback 已经添加,供在 retryTemplate.execute() 中使用。
参见 增加重试功能。
MessageConversionException变更
此异常现在是 AmqpException 的子类。考虑以下代码:
try {
template.convertAndSend("thing1", "thing2", "cat");
}
catch (AmqpException e) {
...
}
catch (MessageConversionException e) {
...
}
第二个 catch 块已不再可达,需要将其移至捕获所有异常的通用 AmqpException catch 块之前。
RabbitMQ 3.4 兼容性
Spring AMQP 现在与 RabbitMQ 3.4 兼容,包括直接回复到功能。
请参阅 兼容性 和 RabbitMQ 直接回复到 获取更多信息。
ContentTypeDelegatingMessageConverter添加
ContentTypeDelegatingMessageConverter 已被引入,用于基于 MessageProperties 中的 contentType 属性选择要使用的 MessageConverter。
消息转换器 可以了解更多信息。
C.2.14. 1.3 版本相对于 1.2 版本的变更说明
监听器并发性
监听器容器现在支持根据工作负载动态调整消费者数量,或者您可以在不中断容器的情况下程序化地更改并发数。
参见 监听器并发。
监听器队列
监听器容器现在允许在运行时修改其监听的队列。此外,如果至少有一个已配置的队列可用,则容器将启动。请参阅监听器容器队列
此侦听器容器现在会在启动期间重新声明任何自动删除的队列。请参阅auto-delete 队列。
消费者优先级
监听器容器现在支持消费者参数,允许设置 x-priority 参数。请参阅 消费者优先级。
专属消费者
现在,您可以通过单个 exclusive 消费者配置 SimpleMessageListenerContainer,从而阻止其他消费者监听该队列。请参阅 独占消费者。
Rabbit Admin
无论设置为 durable、autoDelete 或 exclusive,您现在都可以让代理生成队列名称。另请参阅配置代理。
直接交换绑定
之前,从 binding 元素的 direct-exchange 配置中省略 key 属性会导致队列或交换机以空字符串作为路由键进行绑定。现在,它将使用提供的 Queue 或 Exchange 的名称进行绑定。如果您希望使用空字符串作为路由键进行绑定,则需要指定 key=""。
AmqpTemplate变更
现在,AmqpTemplate提供了几种同步的receiveAndReply方法。这些方法由RabbitTemplate实现。有关更多信息,请参阅接收消息。
现在,RabbitTemplate 支持配置一个 RetryTemplate,以便在代理不可用时尝试重试(可选择性地使用退避策略)。有关详细信息,请参阅添加重试功能。
缓存连接工厂
您可以配置缓存连接工厂,以缓存 Connection 个实例及其 Channel 个实例,而不是使用单个连接并仅缓存 Channel 个实例。
参见 连接和资源管理。
绑定参数
现在,<binding> 的 <exchange> 支持解析 <binding-arguments> 子元素。您现在可以使用 key/value 属性对(用于匹配单个标题)来配置 <binding> 的 <headers-exchange>,或者使用 <binding-arguments> 子元素(允许匹配多个标题)。这些选项互斥。参见头交换。
路由连接工厂
已引入一个新的 SimpleRoutingConnectionFactory。
它允许配置 ConnectionFactories 映射,以在运行时确定要使用的目标 ConnectionFactory。
请参阅 路由连接工厂。
MessageBuilder和MessagePropertiesBuilder
现在提供了用于构建消息或消息属性的“流畅API”。
查看消息构建器API
RetryInterceptorBuilder变更
现在提供了一个用于构建监听器容器重试拦截器的“流畅API”。
参见同步操作中的失败及重试选项。
RepublishMessageRecoverer添加
当重试次数耗尽时,此新提供的MessageRecoverer允许将失败的消息发布到另一个队列(包括堆栈跟踪信息作为消息头)。详情请参阅消息监听器与异步情况。
默认错误处理器(自 1.3.2 版本起)
已向侦听器容器添加默认 ConditionalRejectingErrorHandler。
此错误处理器检测到致命的消息转换问题,并指示容器拒绝消息,以防止代理服务器不断重新发送无法转换的消息。
参见 异常处理。
监听器容器 'missingQueuesFatal' 属性(自 1.3.5 版本起)
现在,SimpleMessageListenerContainer 具有一个名为 missingQueuesFatal 的属性(默认:true)。
以前,缺失队列的情况始终是致命的。
参见消息监听容器配置。
C.2.15. 版本 1.2 相较于 1.1 的变更
RabbitMQ 版本
Spring AMQP 现在默认使用 RabbitMQ 3.1.x(但仍保持对早期版本的兼容性)。
针对 RabbitMQ 3.1.x 不再支持的功能,已添加某些弃用警告——包括Federation交换机以及 immediate 属性在 RabbitTemplate 上的使用。
Rabbit Admin
RabbitAdmin 现在提供了一个选项,允许交换机、队列和绑定的声明在声明失败时继续进行。此前,所有声明在发生失败时都会停止。通过设置 ignore-declaration-exceptions,此类异常会以 WARN 级别记录日志,但后续的声明仍将继续执行。一个可能适用此特性的示例是:当队列声明因略不同的 ttl 设置而失败时,这通常会阻止其他声明继续进行。
RabbitAdmin 现在提供了一个额外的方法,称为 getQueueProperties()。您可使用该方法判断队列是否存在于代理服务器上(对于不存在的队列返回 null)。此外,该方法还会返回当前队列中的消息数量以及当前消费者数量。
RabbitTemplate
之前,当使用 …sendAndReceive() 方法并配合固定回复队列时,会使用两个自定义头信息来传递关联数据,并保留和恢复回复队列信息。本版本中,默认情况下改用标准消息属性(correlationId),尽管您也可以指定一个自定义属性作为替代。此外,嵌套的 replyTo 信息现在会在模板内部进行保留,而不再依赖于自定义头信息。
属性 immediate 已弃用。
在使用 RabbitMQ 3.0.x 或更高版本时,您不得设置此属性。
自动声明队列及其他项目
以前,在声明队列、交换机和绑定时,您无法定义用于声明的连接工厂。每个 RabbitAdmin 都通过其自身的连接来声明所有组件。
从这个版本开始,您现在可以将声明限制为特定的 RabbitAdmin 实例。
请参阅 条件声明。
AMQP 远程调用
现在提供了使用Spring远程调用技术的功能,使用AMQP作为RPC调用的传输协议。
有关详细信息,请参阅远程调用