附录 A.变更记录

A.1 当前版本

See 第 2.2 节“新增功能”.

A.2 以前的版本

A.2.1 从 1.5 开始的 1.6 更改

Testing Support

现在提供了一个新的测试支持库。有关更多信息,请参见第 3.4 节“测试支持”

Builder

现在可以使用构建器,它们提供了用于配置QueueExchange对象的流畅 API。有关更多信息,请参见名为“用于队列和交换的构建器 API”的部分

Namespace Changes

Connection Factory

现在可以在连接工厂 bean 声明中添加thread-factory,例如,命名amqp-client库创建的线程。有关更多信息,请参见第 3.1.2 节“连接和资源 Management”

使用CacheMode.CONNECTION时,您现在可以限制允许的连接总数。有关更多信息,请参见第 3.1.2 节“连接和资源 Management”

Queue Definitions

现在可以为匿名队列提供一种命名策略。有关更多信息,请参见名为“ AnonymousQueue”的部分

侦听器容器更改

空闲消息侦听器检测

现在可以将侦听器容器配置为在空闲时发布ApplicationEvent。有关更多信息,请参见“检测空闲的异步用户”一节

队列检测不匹配

默认情况下,当侦听器容器启动时,如果检测到属性或参数不匹配的队列,则该容器将记录异常,但 continue 侦听。容器现在具有属性mismatchedQueuesFatal,如果在启动过程中检测到问题,它将阻止容器(和上下文)启动。如果稍后检测到问题(例如从连接失败中恢复之后),它还将停止容器。有关更多信息,请参见第 3.1.15 节“消息侦听器容器配置”

侦听器容器记录

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

默认错误处理程序

现在,默认错误处理程序(ConditionalRejectingErrorHandler)认为不可恢复的@RabbitListener异常是致命的。有关更多信息,请参见第 3.1.13 节“异常处理”

自动声明和 RabbitAdmins

有关在应用程序上下文中使用RabbitAdmin对该选项的语义进行的一些更改,请参见第 3.1.15 节“消息侦听器容器配置”(autoDeclare)。

AmqpTemplate:超时接收

AmqpTemplate及其RabbitTemplate实现引入了许多带有timeout的新receive()方法。有关更多信息,请参见名为“轮询 Consumer”的部分

AsyncRabbitTemplate

引入了新的AsyncRabbitTemplate。该模板提供了许多发送和接收方法,其中返回值是ListenableFuture,以后可用于同步或异步获取结果。有关更多信息,请参见名为“ AsyncRabbitTemplate”的部分

RabbitTemplate Changes

1 .4.1 引入了在 broker 支持时使用Direct reply-to的功能;它比为每个答复使用一个临时队列更为有效。此版本允许您通过将useTemporaryReplyQueues属性设置为true来覆盖此默认行为并使用临时队列。有关更多信息,请参见“ RabbitMQ 直接回复”部分

RabbitTemplate现在支持user-id-expression(使用 Java 配置时为userIdExpression)。有关更多信息,请参见经过验证的用户 ID RabbitMQ 文档称为“验证的用户 ID”的部分

Message Properties

CorrelationId

correlationId消息属性现在可以是String。有关更多信息,请参见称为“消息属性转换器”的部分

长字符串标题

以前,DefaultMessagePropertiesConverter头的长度比长字符串限制(默认为 1024)长,已“转换”为DataInputStream(实际上只是引用了LongStringDataInputStream)。在输出时,此 Headers 未转换(除非转换为字符串,例如通过在流上调用toString()来转换为[email protected])。

在此版本中,默认情况下,长LongString保留为LongString。您可以通过getBytes[]toString()getStream()方法访问内容。现在也可以在输出中正确“转换”大的 ImportingLongString

有关更多信息,请参见称为“消息属性转换器”的部分

内送方式

deliveryMode属性不再 Map 到MessageProperties.deliveryMode;如果使用相同的MessageProperties对象发送出站消息,则可以避免意外传播。而是将入站deliveryModeHeadersMap 到MessageProperties.receivedDeliveryMode

有关更多信息,请参见称为“消息属性转换器”的部分

使用带 Comments 的端点时,Headers 提供在名为AmqpHeaders.RECEIVED_DELIVERY_MODE的 Headers 中。

有关更多信息,请参见名为“带 Comments 的端点方法签名”的部分

入站用户 ID

user_id属性不再 Map 到MessageProperties.userId;如果使用相同的MessageProperties对象发送出站消息,则可以避免意外传播。而是将入站userIdHeadersMap 到MessageProperties.receivedUserId

有关更多信息,请参见称为“消息属性转换器”的部分

使用带 Comments 的端点时,Headers 提供在名为AmqpHeaders.RECEIVED_USER_ID的 Headers 中。

有关更多信息,请参见名为“带 Comments 的端点方法签名”的部分

RabbitAdmin Changes

Declaration Failures

以前,ignoreDeclarationFailures标志仅对通道上的IOException生效(例如参数不匹配)。现在,它对任何异常(例如TimeoutException)均生效。另外,每当声明失败时,就会发布DeclarationExceptionEventRabbitAdmin最后的声明事件也可以作为lastDeclarationExceptionEvent属性使用。有关更多信息,请参见第 3.1.10 节,“配置代理”

@RabbitListener Changes

每个 Bean 多个容器

使用 Java 8 或更高版本时,现在可以向@Bean类或其方法添加多个@RabbitListenerComments。使用 Java 7 或更早版本时,可以使用@RabbitListeners容器 Comments 提供相同的功能。有关更多信息,请参见名为“ @Repeatable @RabbitListener”的部分

@SendTo SpEL 表达式

现在,可以将不具有replyTo属性的@SendTo用于路由答复,是针对请求/答复评估的 SpEL 表达式。有关更多信息,请参见称为“回复 Management”的部分

@QueueBinding Improvements

现在,您可以在@QueueBinding注解中为队列,交换和绑定指定参数。 @QueueBinding现在支持头交换。有关更多信息,请参见称为“Comments 驱动的侦听器端点”的部分

邮件交换延迟

Spring AMQP 现在对 RabbitMQ 延迟消息交换插件具有一流的支持。有关更多信息,请参见第 3.1.11 节“延迟的消息交换”

交换内部标志

现在可以将任何Exchange定义标记为internal,并且RabbitAdmin会在声明交换时将值传递给代理。有关更多信息,请参见第 3.1.10 节,“配置代理”

CachingConnectionFactory Changes

CachingConnectionFactory 缓存统计信息

CachingConnectionFactory现在在运行时和 JMX 上提供缓存属性。有关更多信息,请参见名为“运行时缓存属性”的部分

访问底层 RabbitMQ 连接工厂

添加了新的吸气剂以提供对基础工厂的访问。例如,这可用于添加自定义连接属性。有关更多信息,请参见第 3.1.3 节“添加自定义 Client 端连接属性”

Channel Cache

默认的通道缓存大小已从 1 增加到 25.有关更多信息,请参见第 3.1.2 节“连接和资源 Management”

此外,SimpleMessageListenerContainer不再将缓存大小调整为至少等于concurrentConsumers的数量-这是多余的,因为从不缓存容器使用者通道。

RabbitConnectionFactoryBean

现在,工厂 bean 公开一个属性,以将 Client 端连接属性添加到结果工厂进行的 Connecting。

Java Deserialization

使用 Java 反序列化时,现在可以配置允许类的“白名单”。如果您接受来自不受信任来源的带有序列化 Java 对象的消息,那么考虑创建白名单很重要。有关更多信息,请参见称为“ Java 反序列化”的部分

JSON MessageConverter

JSON 消息转换器的改进现在允许使用消息 Headers 中没有类型信息的消息。有关更多信息,请参见称为“带 Comments 方法的消息转换”部分名为“ Jackson2JsonMessageConverter”的部分

Logging Appenders

Log4j2

已添加 log4j2 附加程序,现在可以使用addresses属性配置附加程序以连接到代理群集。

Client 端连接属性

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

有关更多信息,请参见第 3.2 节“记录子系统 AMQP 附加程序”

RabbitTemplate Changes

Tip

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

A.2.2 从 1.4 开始的 1.5 更改

不再支持 spring-erlang

spring-erlang jar 不再包含在分发中。请改用第 3.1.12 节“ RabbitMQ REST API”

CachingConnectionFactory Changes

CachingConnectionFactory 中的空地址属性

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

URI Constructor

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

Connection Reset

已添加新方法resetConnection(),以允许用户重置连接。例如,这可以用于在故障转移到辅助代理之后重新连接到主要代理。这将**影响过程中的操作。现有的destroy()方法的功能完全相同,但是新方法的名称不太令人生畏。

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

当侦听器容器使用者启动时,他们尝试被动声明队列以确保它们在代理上可用。以前,如果这些声明失败(例如,由于队列不存在或移动 HA 队列而失败),则重试逻辑固定为每 5 秒间隔进行 3 次重试。如果队列仍然不存在,则该行为由missingQueuesFatal属性控制(默认为 true)。另外,对于配置为从多个队列侦听的容器,如果只有队列的子集可用,则使用者以 60 秒的固定间隔重试丢失的队列。

这 3 个属性(declarationRetries, failedDeclarationRetryInterval, retryDeclarationInterval)现在是可配置的。有关更多信息,请参见第 3.1.15 节“消息侦听器容器配置”

类套餐变更

RabbitGatewaySupport类已从o.s.amqp.rabbit.core.support移到o.s.amqp.rabbit.core

DefaultMessagePropertiesConverter

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

@RabbitListener Improvements

@RabbitListener 的@QueueBinding

bindings属性已与queues属性互斥地添加到@RabbitListenerComments 中,以允许指定queue,其exchangebinding以便由 Broker 上的RabbitAdmin声明。

SpEL in @SendTo

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

通过属性的多个队列名称

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

有关更多信息,请参见称为“Comments 驱动的侦听器端点”的部分

自动交换,队列,绑定声明

现在可以声明定义了这些实体集合的 bean,而RabbitAdmin会将内容添加到构建连接时将声明的实体列表中。有关更多信息,请参见称为“声明交换,队列,绑定的集合”的部分

RabbitTemplate Changes

reply-address

reply-address属性已作为替代reply-queue添加到<rabbit-template>组件。有关更多信息,请参见第 3.1.9 节“请求/回复消息”。 (也可以在* 1.4.4 *中作为RabbitTemplate上的设置器使用)。

阻止接收方法

RabbitTemplate现在支持receiveconvertAndReceive方法中的阻塞。有关更多信息,请参见名为“轮询 Consumer”的部分

必须使用 SendAndReceive 方法

当使用sendAndReceiveconvertSendAndReceive方法设置mandatory标志时,如果无法传递请求消息,则调用线程将抛出AmqpMessageReturnedException。有关更多信息,请参见称为“答复超时”的部分

不正确的答复侦听器配置

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

有关更多信息,请参见称为“答复侦听器容器”的部分

The RabbitManagementTemplate

引入了RabbitManagementTemplate,以使用其Management Plugin提供的 REST API 监视和配置 RabbitMQ Broker。有关更多信息,请参见第 3.1.12 节“ RabbitMQ REST API”

侦听器容器 Bean 名称(XML)

Tip

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

普通的 Spring bean 名称覆盖被应用;如果使用与现有 Bean 相同的id解析了更高版本的<listener/>,则新定义将覆盖现有 Bean。以前,bean 名称是由<listener-container/><listener/>元素的 ID 组成的。

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

但是,为了支持以组的形式启动/停止容器,已添加了新的group属性。定义此属性后,将此元素创建的容器添加到具有此名称的Collection<SimpleMessageListenerContainer类型的 Bean 中。您可以遍历该组以启动/停止容器。

Class-Level @RabbitListener

现在可以在类级别应用@RabbitListenerComments。与新的@RabbitHandler方法 Comments 一起,这允许根据有效负载类型选择处理程序方法。有关更多信息,请参见称为“多方法侦听器”的部分

SimpleMessageListenerContainer:支持 BackOff

现在可以为SimpleMessageListenerContainer提供BackOff实例以进行consumer启动恢复。有关更多信息,请参见第 3.1.15 节“消息侦听器容器配置”

Channels 关闭记录

引入了一种控制通道关闭的日志级别的机制。参见名为“记录通道关闭事件”的部分

Application Events

现在,当使用者失败时,SimpleMessageListenerContainer会发出应用程序事件。有关更多信息,请参见“Consumer 事件”部分

Consumer 标签配置

以前,异步 Consumer 的 Consumer 标签是由代理生成的。使用此版本,现在可以为侦听器容器提供命名策略。参见“Consumer 标签”部分

MessageListenerAdapter

MessageListenerAdapter现在支持将队列名称(或使用者标记)Map 到方法名称,以根据接收消息的队列来确定要调用的委托方法。

LocalizedQueueConnectionFactory

一个新的连接工厂,该工厂连接到实际存在镜像队列的群集中的节点。

See 名为“队列亲和力和 LocalizedQueueConnectionFactory”的部分.

匿名队列命名

从* version 1.5.3 *开始,您现在可以控制AnonymousQueue名称的生成方式。有关更多信息,请参见名为“ AnonymousQueue”的部分

A.2.3 从 1.3 开始的 1.4 更改

@RabbitListener Annotation

可以使用@RabbitListenerCommentsPOJO 侦听器,该标记由@EnableRabbit<rabbit:annotation-driven />启用。 Spring Framework 4.1 是此功能所必需的。有关更多信息,请参见称为“Comments 驱动的侦听器端点”的部分

RabbitMessagingTemplate

提供了一个新的RabbitMessagingTemplate,以允许用户在内部使用`+248+```+249+``与 RabbitMQ 进行交互,可以将其正常配置。 Spring Framework 4.1 是此功能所必需的。有关更多信息,请参见称为“消息传递集成”的部分

侦听器容器丢失队列致命属性

1 .3.5 在SimpleMessageListenerContainer上引入了missingQueuesFatal属性。现在,这在侦听器容器名称空间元素上可用。参见第 3.1.15 节“消息侦听器容器配置”

RabbitTemplate ConfirmCallback 接口

此接口上的confirm方法具有一个附加参数cause。如果可用,此参数将包含否定确认(nack)的原因。参见称为“发布者确认并返回”的部分

RabbitConnectionFactoryBean

现在提供了一个工厂 bean,以创建CachingConnectionFactory使用的基础 RabbitMQ ConnectionFactory。这样可以使用 Spring 的依赖项注入配置 SSL 选项。参见名为“配置基础 Client 端连接工厂”的部分

CachingConnectionFactory

CachingConnectionFactory现在允许将connectionTimeout设置为名称空间中的属性或属性。它将属性设置在基础 RabbitMQ ConnectionFactory上,参见名为“配置基础 Client 端连接工厂”的部分

Log Appender

已引入 Logback org.springframework.amqp.rabbit.logback.AmqpAppender。它提供类似org.springframework.amqp.rabbit.log4j.AmqpAppender的选项。有关更多信息,请参见这些类的 JavaDocs。

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

附加程序还支持在发送前修改Message-例如,允许添加自定义 Headers。子类应覆盖postProcessMessageBeforeSend()

Listener Queues

现在,默认情况下,侦听器容器现在在启动期间重新声明所有丢失的队列。已将新的auto-declare属性添加到<rabbit:listener-container>中,以防止重新声明。参见“自动删除队列”部分

RabbitTemplate:必填和 connectionFactorySelector 表达式

mandatoryExpressionsendConnectionFactorySelectorExpressionreceiveConnectionFactorySelectorExpression SpELExpression`s properties have been added to the `RabbitTemplatemandatoryExpression用于在使用ReturnCallback时针对每个请求消息评估mandatory布尔值。参见称为“发布者确认并返回”的部分。当提供AbstractRoutingConnectionFactory时,将使用sendConnectionFactorySelectorExpressionreceiveConnectionFactorySelectorExpression来在运行时针对每个 AMQP 协议交互操作确定目标ConnectionFactorylookupKey。参见名为“路由连接工厂”的部分

侦听器和路由连接工厂

可以为SimpleMessageListenerContainer配置路由连接工厂,以启用基于队列名称的连接选择。参见名为“路由连接工厂”的部分

RabbitTemplate:RecoveryCallback 选项

已添加recoveryCallback属性以在retryTemplate.execute()中使用。参见称为“添加重试功能”的部分

MessageConversionException

现在,此异常是AmqpException的子类;如果您有如下代码:

try {
    template.convertAndSend("foo", "bar", "baz");
}
catch (AmqpException e) {
	...
}
catch (MessageConversionException e) {
	...
}

第二个捕获块将不再可用,需要将其移至全部捕获AmqpException捕获块上方。

RabbitMQ 3.4 兼容性

Spring AMQP 现在与 RabbitMQ 3.4 兼容,包括直接回复;有关更多信息,请参见名为“兼容性”的部分“ RabbitMQ 直接回复”部分

ContentTypeDelegatingMessageConverter

已基于MessageProperties中的contentType属性引入ContentTypeDelegatingMessageConverter以选择要使用的MessageConverter。有关更多信息,请参见第 3.1.7 节“消息转换器”

A.2.4 从 1.2 开始的 1.3 更改

Listener Concurrency

侦听器容器现在支持基于工作负载动态调整使用方数量,或者可以通过编程方式更改并发性而无需停止容器。参见第 3.1.16 节“侦听器并发”

Listener Queues

侦听器容器现在允许在运行时修改正在侦听其的队列。此外,如果至少有一个已配置的队列可供使用,则容器现在将启动。见第 3.1.18 节“侦听器容器队列”

现在,此侦听器容器将在启动期间重新声明所有自动删除队列。参见“自动删除队列”部分

Consumer Priority

现在,侦听器容器支持使用者参数,从而可以设置x-priority参数。参见名为“容器”的部分

Exclusive Consumer

现在可以将SimpleMessageListenerContainer配置为一个exclusive使用者,从而防止其他使用者监听队列。参见第 3.1.17 节“独家用户”

Rabbit Admin

现在,无论持久性,自动删除和独占设置如何,都可以使代理生成队列名称。参见第 3.1.10 节,“配置代理”

直接交换绑定

以前,从direct-exchange配置的binding元素中省略key属性会导致队列或交换机绑定一个空字符串作为路由键。现在,它与提供的QueueExchange的名称绑定。希望使用空字符串路由键进行绑定的用户需要指定key=""

AMQP Template

AmqpTemplate现在提供了几种同步receiveAndReply方法。这些由RabbitTemplate实现。有关更多信息,请参见第 3.1.6 节“接收消息”

RabbitTemplate现在支持将RetryTemplate配置为在代理不可用时尝试重试(具有可选的退避策略)。有关更多信息,请参见称为“添加重试功能”的部分

缓存连接工厂

现在可以将缓存连接工厂配置为缓存“连接”及其“通道”,而不是使用单个连接并仅缓存“通道”。参见第 3.1.2 节“连接和资源 Management”

Binding Arguments

<exchange><binding>现在支持<binding-arguments>子元素的解析。 <headers-exchange><binding>现在可以配置为key/value属性对(以在单个 Headers 上匹配)或<binding-arguments>子元素,从而允许在多个 Headers 上进行匹配;这些选项是互斥的。参见称为“简介”的部分

路由连接工厂

引入了新的SimpleRoutingConnectionFactory,以允许配置ConnectionFactoriesMap 来确定要在运行时使用的目标ConnectionFactory。参见名为“路由连接工厂”的部分

MessageBuilder 和 MessagePropertiesBuilder

现在提供了用于构建消息和/或消息属性的“ Fluent API”。参见称为“ Message Builder API”的部分

RetryInterceptorBuilder

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

RepublishMessageRecoverer

提供此新的MessageRecoverer可以在重试用尽时将失败的消息发布到另一个队列(包括 Headers 中的堆栈跟踪信息)。参见称为“消息侦听器和异步情况”的部分

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

默认ConditionalRejectingErrorHandler已添加到侦听器容器。此错误处理程序检测到消息转换问题(这是致命的),并指示容器拒绝该消息,以防止代理不断重新传递不可转换的消息。参见第 3.1.13 节“异常处理”

侦听器容器的'missingQueuesFatal`属性(自 1.3.5 开始)

SimpleMessageListenerContainer现在具有属性missingQueuesFatal(默认为true)。以前,丢失队列始终是致命的。参见第 3.1.15 节“消息侦听器容器配置”

A.2.5 从 1.1 开始更改为 1.2

RabbitMQ Version

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

Rabbit Admin

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

RabbitAdmin现在提供了另一种方法getQueueProperties()。这可用于确定代理上是否存在队列(对于不存在的队列返回 null)。此外,还返回队列中的当前消息数以及使用方的当前数。

Rabbit Template

以前,当将...sendAndReceive()方法用于固定答复队列时,两个自定义 Headers 用于关联数据并保留/恢复答复队列信息。在此版本中,默认情况下使用标准消息属性correlationId,尽管用户可以指定要使用的自定义属性。此外,嵌套的replyTo信息现在保留在模板内部,而不是使用自定义 Headers。

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

JSON 消息转换器

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

自动声明队列等

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

从此版本开始,现在可以将声明限制为特定的RabbitAdmin实例。参见称为“有条件的声明”的部分

AMQP Remoting

现在提供了使用 Spring Remoting 技术的工具,使用 AMQP 作为 RPC 调用的传输。有关更多信息,请参见“使用 AMQP 进行 Spring 远程处理”部分

请求的心跳

一些用户要求在 Spring AMQP CachingConnectionFactory上公开基础 Client 端连接工厂的requestedHeartBeats属性。现在可以使用;以前,有必要将 AMQPClient 端工厂配置为单独的 bean,并在CachingConnectionFactory中提供对其的引用。

A.2.6 从 1.0 开始更改为 1.1

General

Spring-AMQP 现在使用 gradle 构建。

添加对发布者确认和return的支持。

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

增加了对死信交换/死信队列的支持。

AMQP Log4j Appender

添加一个选项以支持将消息 ID 添加到已记录的消息中。

添加了一个选项,允许在转换String`s to `byte[]时使用Charset名称的指定。