附录 C:更改历史
本节介绍随着版本更改而进行的更改。
C.1. 当前版本
查看新增功能。
C.2. 以前的版本
C.2.1. 2.4 自 2.3 以来的变化
本节介绍 2.3 版和 2.4 版之间的更改。 有关先前版本中的更改,请参阅更改历史记录。
@RabbitListener
变化
MessageProperties
现在可用于参数匹配。
有关详细信息,请参阅带注释的端点方法签名。
RabbitAdmin
变化
新属性recoverManualDeclarations
允许恢复手动声明的队列/交换/绑定。
有关详细信息,请参阅恢复自动删除声明。
C.2.2. 消息转换器更改
这Jackson2JsonMessageConverter
现在可以从contentEncoding
页眉。
有关详细信息,请参阅 Jackson2JsonMessageConverter。
C.2.3. 消息转换器更改
这Jackson2JsonMessageConverter
现在可以从contentEncoding
页眉。
有关详细信息,请参阅 Jackson2JsonMessageConverter。
C.2.4. 流支持更改
RabbitStreamOperations
和RabbitStreamTemplate
已被弃用,取而代之的是RabbitStreamOperations2
和RabbitStreamTemplate2
分别;他们回来了CompletableFuture
而不是ListenableFuture
.
有关更多信息,请参阅使用 RabbitMQ Stream 插件。
C.2.5. 2.3 自 2.2 以来的变化
本节介绍 2.2 版和 2.3 版之间的更改。 有关先前版本中的更改,请参阅更改历史记录。
连接工厂更改
现在提供了两个额外的连接工厂。 有关详细信息,请参阅选择连接工厂。
@RabbitListener
变化
现在可以指定回复内容类型。 有关详细信息,请参阅回复 ContentType。
消息转换器更改
这Jackson2JMessageConverter
s 现在可以反序列化抽象类(包括接口),如果ObjectMapper
配置了自定义解串器。
有关详细信息,请参阅反序列化抽象类。
测试更改
新注释@SpringRabbitTest
用于在您不使用SpringBootTest
.
有关详细信息,请参阅@SpringRabbitTest。
RabbitTemplate 更改
模板的ReturnCallback
已重构为ReturnsCallback
以便在 lambda 表达式中更简单地使用。
有关详细信息,请参阅相关发布者确认和退货。
使用退货和相关确认时,CorrelationData
现在需要一个唯一的id
财产。
有关详细信息,请参阅相关发布者确认和退货。
使用直接回复时,您现在可以配置模板,以便服务器不需要返回与回复的关联数据。 有关更多信息,请参阅 RabbitMQ 直接回复。
侦听器容器更改
新的侦听器容器属性consumeDelay
现已上市;它在使用 RabbitMQ 分片插件时很有帮助。
默认值JavaLangErrorHandler
现在调用System.exit(99)
.
要恢复到以前的行为(不执行任何作),请添加一个无作处理程序。
容器现在支持globalQos
属性来应用prefetchCount
全局,而不是渠道上的每个使用者。
有关详细信息,请参阅消息侦听器容器配置。
MessagePostProcessor 更改
压缩MessagePostProcessor
现在使用逗号来分隔多个内容编码,而不是冒号。解压缩器可以处理这两种格式,但是,如果您使用此版本生成的消息被 2.2.12 之前的版本使用,则应将压缩器配置为使用旧的分隔符。有关更多信息,请参阅修改消息 - 压缩等中的重要说明。
多个代理支持改进
有关更多信息,请参阅多代理(或集群)支持。
RepublishMessageRecoverer 更改
未提供此恢复器的新子类来支持发布者确认。 有关详细信息,请参阅消息侦听器和异步案例。
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) 现在是一个可选的依赖项,将不再显示为传递依赖项。
这spring-rabbit-junit
模块现在是spring-rabbit-test
模块,以便在只有单个spring-rabbit-test
我们获得了 AMQP 组件的完整测试实用程序堆栈。
“重大”API 更改
JUnit (5)RabbitAvailableCondition.getBrokerRunning()
现在返回一个BrokerRunningSupport
实例而不是BrokerRunning
,这取决于 JUnit 4。
它具有相同的 API,因此只需更改任何引用的类名即可。
有关更多信息,请参阅 JUnit5 条件。
ListenerContainer 更改
默认情况下,具有致命异常的消息现在会被拒绝并且不会重新排队,即使确认模式是手动的也是如此。 有关详细信息,请参阅异常处理。
现在可以使用 Micrometer 监控监听器性能Timer
s.
有关详细信息,请参阅监视侦听器性能。
@RabbitListener变化
您现在可以配置executor
,覆盖出厂配置,以便更轻松地识别与侦听器关联的线程。
您现在可以覆盖容器工厂的acknowledgeMode
属性替换为注释的ackMode
财产。
有关更多信息,请参阅覆盖容器工厂属性。
使用批处理时,@RabbitListener
方法现在可以在一次调用中接收完整的一批消息,而不是一次获取一条消息。
当一次接收一条批处理消息时,最后一条消息具有isLastInBatch
message 属性设置为 true。
此外,收到的批处理消息现在包含amqp_batchSize
页眉。
侦听器还可以使用SimpleMessageListenerContainer
,即使批次不是由生产者创建的。
有关详细信息,请参阅选择容器。
Spring Data Projection 接口现在受Jackson2JsonMessageConverter
.
有关更多信息,请参阅使用 Spring Data Projection 接口。
这Jackson2JsonMessageConverter
如果没有contentType
属性,或者它是默认值 (application/octet-string
).
看从Message
了解更多信息。
同样地。这Jackson2XmlMessageConverter
现在假设内容是 XML,如果没有contentType
属性,或者它是默认值 (application/octet-string
).
看Jackson2XmlMessageConverter
了解更多信息。
当@RabbitListener
方法返回一个结果,bean 和Method
现在在回复消息属性中可用。
这允许配置beforeSendReplyMessagePostProcessor
例如,在回复中设置一个标头,以指示在服务器上调用了哪个方法。
有关更多信息,请参阅回复管理。
您现在可以配置ReplyPostProcessor
在发送回复消息之前对其进行修改。
有关更多信息,请参阅回复管理。
AMQP 日志记录附加器更改
Log4J 和 LogbackAmqpAppender
s 现在支持verifyHostname
SSL 选项。
此外,现在可以将这些附加器配置为不将 MDC 条目添加为标头。
这addMdcAsHeaders
引入了 boolean 选项来配置此类行为。
附加器现在支持SaslConfig
财产。
有关更多信息,请参阅日志记录子系统 AMQP 附加器。
MessageListenerAdapter 更改
这MessageListenerAdapter
现在提供新的buildListenerArguments(Object, Channel, Message)
方法来构建要传递给目标侦听器的参数数组,并且旧的参数已被弃用。
看MessageListenerAdapter
了解更多信息。
交换/队列声明更改
这ExchangeBuilder
和QueueBuilder
用于创建 Fluent APIExchange
和Queue
用于声明的对象RabbitAdmin
现在支持“众所周知”的论点。
有关更多信息,请参阅队列和交换的构建器 API。
这RabbitAdmin
有一个新属性explicitDeclarationsOnly
. 有关详细信息,请参阅条件声明。
连接工厂更改
这CachingConnectionFactory
有一个新属性shuffleAddresses
. 提供代理节点地址列表时,将在创建连接之前对列表进行打乱,以便尝试连接的顺序是随机的。有关更多信息,请参阅连接到集群。
使用 Publisher 确认并返回时,现在在连接工厂的executor
.
这避免了amqp-clients
库,如果从回调中执行 rabbit作。
有关详细信息,请参阅相关发布者确认和退货。
此外,发布者确认类型现在使用ConfirmType
enum 而不是两个互斥的 setter 方法。
这RabbitConnectionFactoryBean
现在,启用 SSL 时默认使用 TLS 1.2。
看RabbitConnectionFactoryBean
和配置 SSL了解更多信息。
新的 MessagePostProcessor 类
类DeflaterPostProcessor
和InflaterPostProcessor
添加了,以分别支持压缩和解压缩,当消息内容编码设置为deflate
.
其他变化
这Declarables
对象(用于声明多个队列、交换、绑定)现在为每种类型都有一个过滤的 getter。
有关详细信息,请参阅声明交换、队列和绑定的集合。
您现在可以自定义每个Declarable
bean 之前的RabbitAdmin
处理其声明。
有关详细信息,请参阅自动声明交换、队列和绑定。
singleActiveConsumer()
已添加到QueueBuilder
将x-single-active-consumer
queue 参数。
有关更多信息,请参阅队列和交换的构建器 API。
值类型为Class<?>
现在使用getName()
而不是toString()
.
有关详细信息,请参阅消息属性转换器。
现在支持恢复失败的生产者创建的批次。 有关更多信息,请参阅使用批处理侦听器重试。
C.2.7. 2.1 自 2.0 以来的变化
AMQP 客户端库
Spring AMQP 现在使用 5.4.x 版本的amqp-client
RabbitMQ 团队提供的库。该客户端默认配置了自动恢复。参见 RabbitMQ 自动连接/拓扑恢复。
从 4.0 版本开始,客户端默认启用自动恢复。虽然与此功能兼容,但 Spring AMQP 有自己的恢复机制,通常不需要客户端恢复功能。我们建议禁用amqp-client 自动恢复,避免获得AutoRecoverConnectionNotCurrentlyOpenException 代理可用但连接尚未恢复时。从 1.7.1 版开始,Spring AMQP 会禁用它,除非您显式创建自己的 RabbitMQ 连接工厂并将其提供给CachingConnectionFactory .
兔子MQConnectionFactory 由RabbitConnectionFactoryBean 默认情况下,还禁用该选项。 |
包更改
某些类已移至不同的包。
大多数是内部类,不会影响用户应用程序。
两个例外是ChannelAwareMessageListener
和RabbitListenerErrorHandler
.
这些接口现在位于org.springframework.amqp.rabbit.listener.api
.
发布者确认更改
当存在未完成的确认时,为发布者确认启用的通道不会返回到缓存中。有关详细信息,请参阅相关发布者确认和返回。
侦听器容器工厂改进
您现在可以使用侦听器容器工厂创建任何侦听器容器,而不仅仅是用于@RabbitListener
注释或@RabbitListenerEndpointRegistry
.
有关更多信息,请参阅使用容器工厂。
ChannelAwareMessageListener
现在继承自MessageListener
.
代理事件侦听器
一个BrokerEventListener
引入以将选定的代理事件发布为ApplicationEvent
实例。
有关更多信息,请参阅代理事件侦听器。
RabbitAdmin 更改
这RabbitAdmin
发现类型Declarables
(这是一个容器Declarable
- Queue
,Exchange
和Binding
objects),并在代理上声明包含的对象。
不鼓励用户使用旧的声明机制<Collection<Queue>>
(和其他)并且应该使用Declarables
豆子代替。
默认情况下,旧机制处于禁用状态。
有关详细信息,请参阅声明交换、队列和绑定的集合。
AnonymousQueue
实例现在使用x-queue-master-locator
设置为client-local
默认情况下,确保在应用程序连接到的节点上创建队列。
有关更多信息,请参阅配置代理。
RabbitTemplate 更改
您现在可以配置RabbitTemplate
使用noLocalReplyConsumer
控制noLocal
标记sendAndReceive()
操作。
有关详细信息,请参阅请求/回复消息。
CorrelationData
对于发布商确认,现在有一个ListenableFuture
,您可以使用它来获取确认,而不是使用回调。
启用返回和确认后,将使用返回的消息填充相关数据(如果提供)。
有关详细信息,请参阅相关发布者确认和退货。
一个名为replyTimedOut
现在提供以通知子类回复已超时,从而允许任何状态清理。
有关更多信息,请参阅回复超时。
您现在可以指定ErrorHandler
将请求/回复与DirectReplyToMessageListenerContainer
(默认值)当传递回复时发生异常(例如,延迟回复)。
看setReplyErrorHandler
在RabbitTemplate
.
(也是从 2.0.11 开始)。
消息转换
我们引入了一个新的Jackson2XmlMessageConverter
以支持将消息从 XML 格式转换到 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.getRabbitConnectionFactory()
.setAutomaticRecoveryEnabled()
) 在CachingConnectionFactory
,我们强烈建议您不要这样做。
建议使用单独的 RabbitMQConnectionFactory
如果您在直接使用客户端工厂(而不是使用 Spring AMQP 组件)时需要自动恢复连接。
侦听器容器更改
默认值ConditionalRejectingErrorHandler
现在完全丢弃导致致命错误的消息,如果x-death
header 存在。
有关详细信息,请参阅异常处理。
立即重新排队
一个新的ImmediateRequeueAmqpException
引入以通知侦听器容器必须将消息重新排队。
要使用此功能,新的ImmediateRequeueMessageRecoverer
实现。
有关详细信息,请参阅消息侦听器和异步案例。
C.2.8. 自 1.7 以来 2.0 的变化
用CachingConnectionFactory
从 2.0.2 版开始,您可以配置RabbitTemplate
使用与侦听器容器使用的连接不同的连接。
此更改可避免在生产者因任何原因被阻止时死锁的使用者。
有关详细信息,请参阅使用单独的连接。
AMQP 客户端库
Spring AMQP 现在使用新的 5.0.x 版本的amqp-client
RabbitMQ 团队提供的库。
默认情况下,此客户端配置了自动恢复。
请参见 RabbitMQ 自动连接/拓扑恢复。
从 4.0 版开始,客户端默认启用自动恢复。
虽然与此功能兼容,但 Spring AMQP 有自己的恢复机制,通常不需要客户端恢复功能。
我们建议您禁用amqp-client 自动恢复,避免获得AutoRecoverConnectionNotCurrentlyOpenException 代理可用但连接尚未恢复时。从 1.7.1 版开始,Spring AMQP 会禁用它,除非您显式创建自己的 RabbitMQ 连接工厂并将其提供给CachingConnectionFactory .
兔子MQConnectionFactory 由RabbitConnectionFactoryBean 默认情况下,还禁用该选项。 |
一般更改
这ExchangeBuilder
现在默认构建持久交换。
这@Exchange
注释@QeueueBinding
默认情况下还声明持久交换。
这@Queue
注释@RabbitListener
默认情况下,如果命名,则声明持久队列,如果匿名,则声明非持久队列。
有关更多信息,请参阅队列和交换的构建器 API 和注释驱动的侦听器端点。
已删除的类
UniquelyNameQueue
不再提供。
创建具有唯一名称的持久非自动删除队列是不寻常的。
该类已被删除。
如果您需要其功能,请使用new Queue(UUID.randomUUID().toString())
.
Log4j 附加器
由于 log4j 的生命周期结束,此附加器不再可用。 有关可用日志附加器的信息,请参阅日志记录子系统 AMQP 附加器。
RabbitTemplate
变化
以前,非事务性RabbitTemplate 如果现有事务在事务侦听器容器线程上运行,则参与该事务。
这是一个严重的错误。
但是,用户可能依赖于此行为。
从 1.6.2 版本开始,您必须将channelTransacted boolean 以使其参与容器事务。 |
这RabbitTemplate
现在使用DirectReplyToMessageListenerContainer
(默认情况下),而不是为每个请求创建一个新的使用者。
有关更多信息,请参阅 RabbitMQ 直接回复。
这AsyncRabbitTemplate
现在支持直接回复。
有关更多信息,请参阅异步兔子模板。
这RabbitTemplate
和AsyncRabbitTemplate
现在有receiveAndConvert
和convertSendAndReceiveAsType
采用ParameterizedTypeReference<T>
参数,让调用者指定要将结果转换为的类型。
这对于复杂类型或未在消息头中传达类型信息时特别有用。
它需要一个SmartMessageConverter
例如Jackson2JsonMessageConverter
.
请参阅接收消息、请求/回复消息、异步兔模板和从Message
跟RabbitTemplate
了解更多信息。
您现在可以使用RabbitTemplate
在专用通道上执行多个作。
有关详细信息,请参阅作用域作。
侦听器适配器
一个方便的FunctionalInterface
可用于将 lambda 与MessageListenerAdapter
.
看MessageListenerAdapter
了解更多信息。
侦听器容器更改
预取默认值(Prefetch Default Value)
预取默认值过去为 1,这可能导致高效使用者的利用率不足。 默认预取值现在为 250,这应该会让消费者在大多数常见场景中保持忙碌,并且, 因此,提高吞吐量。
在某些情况下,预提取值应 be low — 例如,对于大消息,尤其是在处理速度较慢的情况下(消息可能会加起来 到客户端进程中的大量内存),以及是否需要严格的消息排序 (在这种情况下,预取值应设置回 1)。 此外,对于低容量消息传递和多个使用者(包括单个侦听器容器实例中的并发性),您可能希望减少预取,以便在使用者之间获得更均匀的消息分布。 |
有关预取的更多背景信息,请参阅这篇关于 RabbitMQ 中消费者利用率的文章和这篇关于排队理论的文章。
消息计数
以前MessageProperties.getMessageCount()
返回0
用于容器发出的消息。
此属性仅适用于使用basicGet
(例如,从RabbitTemplate.receive()
方法),现在初始化为null
用于容器消息。
事务回滚行为
事务回滚时的消息重新排队现在是一致的,无论是否配置了事务管理器。 有关更多信息,请参阅有关回滚已接收消息的说明。
关机行为
如果容器线程在shutdownTimeout
,则通道默认强制关闭。
有关详细信息,请参阅消息侦听器容器配置。
连接工厂更改
连接和通道侦听器接口现在提供了一种获取有关异常的信息的机制。 有关详细信息,请参阅连接和通道侦听器和发布是异步的 — 如何检测成功和失败。
一个新的ConnectionNameStrategy
现在提供了从AbstractConnectionFactory
.
有关详细信息,请参阅连接和资源管理。
重试更改
这MissingMessageIdAdvice
不再提供。
它的功能现在是内置的。
有关详细信息,请参阅同步作中的失败和重试选项。
匿名队列命名
默认情况下,AnonymousQueues
现在使用默认的Base64UrlNamingStrategy
而不是简单的UUID
字符串。
看AnonymousQueue
了解更多信息。
@RabbitListener
变化
您现在可以在@RabbitListener
附注。
有关更多信息,请参阅注释驱动的侦听器端点。
您现在可以配置@RabbitListener
注释,以便将任何异常返回给发送方。
您还可以配置RabbitListenerErrorHandler
处理异常。
有关详细信息,请参阅处理异常。
现在,当您使用@QueueBinding
注解。
也@QueueBinding.exchange()
现在支持自定义交换类型,并默认声明持久交换。
现在,您可以将concurrency
在注释级别的侦听器容器,而不必为不同的并发设置配置不同的容器工厂。
现在,您可以将autoStartup
属性,覆盖容器工厂中的默认设置。
现在可以设置接收后和发送(回复)前MessagePostProcessor
实例中的RabbitListener
集装箱工厂。
有关更多信息,请参阅注释驱动的侦听器端点。
从 2.0.3 版本开始,其中一个@RabbitHandler
类级别的注释@RabbitListener
可以指定为默认值。
有关更多信息,请参阅多方法侦听器。
容器条件回滚
使用外部事务管理器(例如 JDBC)时,当您向容器提供事务属性时,现在支持基于规则的回滚。 当您使用交易建议时,它现在也更加灵活。 有关更多信息,请参阅条件回滚。
删除 Jackson 1.x 支持
在以前的版本中已弃用,Jackson1.x
转换器和相关组件现已被删除。
您可以使用基于 Jackson 2.x 的类似组件。
有关详细信息,请参阅 Jackson2JsonMessageConverter。
JSON 消息转换器
当TypeId
设置为Hashtable
对于入站 JSON 消息,默认转换类型现在为LinkedHashMap
.
以前,它是Hashtable
.
要恢复到Hashtable
,您可以使用setDefaultMapType
在DefaultClassMapper
.
XML 解析器
解析时Queue
和Exchange
XML 组件时,解析器不再注册name
属性值作为 Bean 别名,如果id
属性存在。
看关于id
和name
属性了解更多信息。
被阻止的连接
您现在可以注入com.rabbitmq.client.BlockedListener
进入org.springframework.amqp.rabbit.connection.Connection
对象。 此外,ConnectionBlockedEvent
和ConnectionUnblockedEvent
事件由ConnectionFactory
当连接被 Broker 阻止或取消阻止时。
有关详细信息,请参阅连接和资源管理。
C.2.9. 1.7 自 1.6 以来的变化
AMQP 客户端库
Spring AMQP 现在使用新的 4.0.x 版本的amqp-client
RabbitMQ 团队提供的库。该客户端默认配置了自动恢复。参见 RabbitMQ 自动连接/拓扑恢复。
默认情况下,4.0.x 客户端启用自动恢复。
虽然与此功能兼容,但 Spring AMQP 有自己的恢复机制,通常不需要客户端恢复功能。
我们建议禁用amqp-client 自动恢复,避免获得AutoRecoverConnectionNotCurrentlyOpenException 代理可用但连接尚未恢复时。从 1.7.1 版开始,Spring AMQP 会禁用它,除非您显式创建自己的 RabbitMQ 连接工厂并将其提供给CachingConnectionFactory .
兔子MQConnectionFactory 由RabbitConnectionFactoryBean 默认情况下,还禁用该选项。 |
Log4j 2 升级
最低 Log4j 2 版本(对于AmqpAppender
) 现在是2.7
.
该框架不再与以前的版本兼容。
有关更多信息,请参阅日志记录子系统 AMQP 附加器。
Logback Appender
默认情况下,此附加器不再捕获调用方数据(方法、行号)。
您可以通过将includeCallerData
配置选项。
有关可用日志附加器的信息,请参阅日志记录子系统 AMQP 附加器。
Spring 重试升级
最低的 Spring Retry 版本现在是1.2
.
该框架不再与以前的版本兼容。
关机行为
您现在可以设置forceCloseChannel
自true
因此,如果容器线程在shutdownTimeout
,通道被强制关闭,
导致任何未确认的消息重新排队。
有关详细信息,请参阅消息侦听器容器配置。
JUnit@Rules
以前由框架内部使用的规则现在可以在一个名为spring-rabbit-junit
.
看JUnit4@Rules
了解更多信息。
连接命名策略
一个新的ConnectionNameStrategy
现在提供了从AbstractConnectionFactory
.
有关详细信息,请参阅连接和资源管理。
侦听器容器更改
事务回滚行为
现在,无论是否配置了事务管理器,都可以将事务回滚时的消息重新排队配置为一致。 有关更多信息,请参阅有关回滚已接收消息的说明。
C.2.10. 早期版本
有关先前版本中的更改,请参阅以前的版本。
C.2.11. 1.6 自 1.5 以来的变化
测试支持
现在提供了一个新的测试支持库。 有关更多信息,请参阅测试支持。
架构工人
提供流畅 API 用于配置的构建器Queue
和Exchange
对象现在可用。有关更多信息,请参阅队列和交换的构建器 API。
命名空间更改
连接工厂
您现在可以添加thread-factory
到连接工厂 bean 声明 — 例如,将线程命名为由amqp-client
图书馆。 有关详细信息,请参阅连接和资源管理。
当您使用CacheMode.CONNECTION
,您现在可以限制允许的连接总数。有关更多信息,请参阅连接和资源管理。
队列定义
现在,您可以为匿名队列提供命名策略。 看AnonymousQueue
了解更多信息。
侦听器容器更改
空闲消息侦听器检测
您现在可以配置要发布的侦听器容器ApplicationEvent
空闲时的实例。有关详细信息,请参阅检测空闲异步使用者。
队列检测不匹配
默认情况下,当侦听器容器启动时,如果检测到属性或参数不匹配的队列,容器会记录异常,但会继续监听。容器现在有一个名为mismatchedQueuesFatal
,这会阻止容器(和上下文)启动,如果在启动期间检测到问题。如果稍后检测到问题,例如从连接故障中恢复后,它还会停止容器。有关更多信息,请参阅消息侦听器容器配置。
默认错误处理程序
默认错误处理程序 (ConditionalRejectingErrorHandler
) 现在认为不可恢复@RabbitListener
异常为致命。有关详细信息,请参阅异常处理。
AutoDeclare
和RabbitAdmin
实例
请参阅消息侦听器容器配置 (autoDeclare
)以对该选项的语义进行一些更改,以进行一些更改
之RabbitAdmin
应用程序上下文中的实例。
AmqpTemplate
:超时接收
一些新的receive()
方法timeout
已为AmqpTemplate
及其RabbitTemplate
实现。
有关详细信息,请参阅轮询消费者。
用AsyncRabbitTemplate
一个新的AsyncRabbitTemplate
已被引入。
此模板提供了许多发送和接收方法,其中返回值是ListenableFuture
,可以
稍后用于同步或异步获取结果。
有关更多信息,请参阅异步兔子模板。
RabbitTemplate
变化
1.4.1 引入了在代理支持时使用直接回复的功能。
它比对每个回复使用临时队列更有效。
此版本允许您覆盖此默认行为,并通过将useTemporaryReplyQueues
属性设置为true
.
有关更多信息,请参阅 RabbitMQ 直接回复。
这RabbitTemplate
现在支持user-id-expression
(userIdExpression
使用 Java 配置时)。
有关更多信息,请参阅已验证的用户 ID RabbitMQ 文档和已验证的用户 ID。
消息属性
用CorrelationId
这correlationId
message 属性现在可以是String
.
有关详细信息,请参阅消息属性转换器。
长字符串标头
以前,DefaultMessagePropertiesConverter
“converted”标头长度超过长字符串限制(默认为 1024)
设置为DataInputStream
(实际上,它引用了LongString
实例的DataInputStream
).
在输出时,此标头未被转换(除了转换为 String — 例如java.io.DataInputStream@1d057a39
通过调用toString()
在直播中)。
通过此版本,长LongString
实例现在保留为LongString
实例。
您可以使用getBytes[]
,toString()
或getStream()
方法。
大量传入LongString
现在在输出时也正确“转换”。
有关详细信息,请参阅消息属性转换器。
入库配送模式
这deliveryMode
属性不再映射到MessageProperties.deliveryMode
. 如果相同,则此更改可避免意外传播MessageProperties
对象用于发送出站消息。相反,入站deliveryMode
header 映射到MessageProperties.receivedDeliveryMode
.
有关详细信息,请参阅消息属性转换器。
使用带注释的端点时,标头在名为AmqpHeaders.RECEIVED_DELIVERY_MODE
.
有关详细信息,请参阅带注释的端点方法签名。
入站用户 ID
这user_id
属性不再映射到MessageProperties.userId
. 如果相同,则此更改可避免意外传播MessageProperties
对象用于发送出站消息。相反,入站userId
header 映射到MessageProperties.receivedUserId
.
有关详细信息,请参阅消息属性转换器。
使用带注释的终结点时,标头将在名为AmqpHeaders.RECEIVED_USER_ID
.
有关详细信息,请参阅带注释的端点方法签名。
RabbitAdmin
变化
声明失败
以前,ignoreDeclarationFailures
标志仅对IOException
在通道上(例如不匹配
参数)。
它现在对任何异常(例如TimeoutException
).
此外,一个DeclarationExceptionEvent
现在每当声明失败时都会发布。
这RabbitAdmin
last 声明事件也可用作属性lastDeclarationExceptionEvent
.
有关更多信息,请参阅配置代理。
@RabbitListener
变化
每个 Bean 的多个容器
当您使用 Java 8 或更高版本时,您现在可以添加多个@RabbitListener
注释到@Bean
classes 或
他们的方法。
使用 Java 7 或更早版本时,您可以使用@RabbitListeners
容器注释以提供相同的
功能性。
看@Repeatable
@RabbitListener
了解更多信息。
@SendTo
SpEL 表达式
@SendTo
用于路由无replyTo
属性现在可以是 SpEL 表达式,根据
请求/回复。
有关更多信息,请参阅回复管理。
@QueueBinding
改进
您现在可以在@QueueBinding
附注。
现在支持@QueueBinding
.
有关更多信息,请参阅注释驱动的侦听器端点。
延迟消息交换
Spring AMQP 现在对 RabbitMQ Delayed Message Exchange 插件具有一流的支持。 有关详细信息,请参阅延迟消息交换。
Exchange 内部标志
任何Exchange
定义现在可以标记为internal
和RabbitAdmin
在以下情况下将值传递给代理
宣布交换。
有关更多信息,请参阅配置代理。
CachingConnectionFactory
变化
CachingConnectionFactory
缓存统计信息
这CachingConnectionFactory
现在在运行时和 JMX 上提供缓存属性。
有关更多信息,请参阅运行时缓存属性。
访问底层 RabbitMQ 连接工厂
添加了一个新的 getter 以提供对底层工厂的访问。 例如,您可以使用此 getter 添加自定义连接属性。 有关详细信息,请参阅添加自定义客户端连接属性。
通道缓存(Channel Cache)
默认通道缓存大小已从 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
属性现在是可配置的。
有关详细信息,请参阅消息侦听器容器配置。
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
).
阻塞receive
方法
这RabbitTemplate
现在支持阻止receive
和convertAndReceive
方法。
有关详细信息,请参阅轮询消费者。
强制使用sendAndReceive
方法
当mandatory
标志在使用sendAndReceive
和convertSendAndReceive
方法,调用线程
抛出一个AmqpMessageReturnedException
如果无法传递请求消息。
有关更多信息,请参阅回复超时。
RabbitManagementTemplate
添加
这RabbitManagementTemplate
引入了 RabbitMQ Broker 的管理插件提供的 REST API 来监控和配置 RabbitMQ Broker。
有关更多信息,请参阅 RabbitMQ REST API。
侦听器容器 Bean 名称 (XML)
这 应用正常的 Spring Bean 名称覆盖。
如果稍后的 迁移到此版本时,如果有 |
但是,为了支持将容器作为一个组启动和停止,新的group
属性。
定义此属性后,此元素创建的容器将添加到具有此名称的 bean 中,类型为Collection<SimpleMessageListenerContainer>
.
可以循环访问此组以启动和停止容器。
班级@RabbitListener
这@RabbitListener
现在可以在类级别应用注释。
与新的@RabbitHandler
方法注释,这允许您根据有效负载类型选择处理程序方法。
有关更多信息,请参阅多方法侦听器。
SimpleMessageListenerContainer
: BackOff 支持
这SimpleMessageListenerContainer
现在可以提供BackOff
实例consumer
启动恢复。
有关详细信息,请参阅消息侦听器容器配置。
通道关闭日志记录
引入了一种控制通道关闭日志水平的机制。 请参阅记录通道关闭事件。
应用程序事件
这SimpleMessageListenerContainer
现在在使用者发生故障时发出应用程序事件。
有关详细信息,请参阅消费者事件。
消费者标签配置
以前,异步使用者的使用者标签是由代理生成的。 在此版本中,现在可以向侦听器容器提供命名策略。 请参阅消费者标签。
匿名队列命名
从 1.5.3 版本开始,您现在可以控制如何AnonymousQueue
生成名称。
看AnonymousQueue
了解更多信息。
C.2.13. 1.4 自 1.3 以来的变化
@RabbitListener
注解
POJO 监听器可以使用@RabbitListener
,由@EnableRabbit
或<rabbit:annotation-driven />
. 此功能需要 Spring Framework 4.1。有关更多信息,请参阅 Annotation-driven Listener Endpoints 。
RabbitMessagingTemplate
添加
一个新的RabbitMessagingTemplate
允许您通过使用spring-messaging
Message
实例。 在内部,它使用RabbitTemplate
,您可以正常配置。此功能需要 Spring Framework 4.1。有关更多信息,请参阅消息传递集成。
侦听器容器missingQueuesFatal
属性
1.3.5 引入了missingQueuesFatal
属性SimpleMessageListenerContainer
. 现在,这在侦听器容器命名空间元素上可用。请参阅消息侦听器容器配置。
兔子模板ConfirmCallback
接口
这confirm
方法有一个额外的参数,称为cause
. 如果可用,此参数包含否定确认 (nack) 的原因。请参阅相关发布者确认和返回。
RabbitConnectionFactoryBean
添加
RabbitConnectionFactoryBean
创建底层 RabbitMQConnectionFactory
由CachingConnectionFactory
. 这允许使用 Spring 的依赖注入配置 SSL 选项。请参阅配置底层客户端连接工厂。
用CachingConnectionFactory
这CachingConnectionFactory
现在让connectionTimeout
设置为命名空间中的属性或属性。它在底层 RabbitMQ 上设置属性ConnectionFactory
. 请参阅配置底层客户端连接工厂。
日志附加器
日志返回org.springframework.amqp.rabbit.logback.AmqpAppender
已被引入。它提供了类似于org.springframework.amqp.rabbit.log4j.AmqpAppender
. 有关更多信息,请参阅这些类的 JavaDoc。
日志4jAmqpAppender
现在支持deliveryMode
属性 (PERSISTENT
或NON_PERSISTENT
违约:PERSISTENT
). 以前,所有 log4j 消息都是PERSISTENT
.
附加器还支持修改Message
发送之前 — 例如,允许添加自定义标头。子类应该覆盖postProcessMessageBeforeSend()
.
侦听器队列
现在,默认情况下,侦听器容器会在启动期间重新声明任何丢失的队列。一个新的auto-declare
属性已添加到<rabbit:listener-container>
以防止这些重新声明。 看auto-delete
队列.
RabbitTemplate
:mandatory
和connectionFactorySelector
表达 式
这mandatoryExpression
,sendConnectionFactorySelectorExpression
和receiveConnectionFactorySelectorExpression
SpEL 表达式的属性已添加到RabbitTemplate
. 这mandatoryExpression
用于评估mandatory
当ReturnCallback
正在使用中。请参阅相关发布者确认和返回。 这sendConnectionFactorySelectorExpression
和receiveConnectionFactorySelectorExpression
当AbstractRoutingConnectionFactory
,以确定lookupKey
对于目标ConnectionFactory
在每个 AMQP 协议交互作的运行时。请参阅路由连接工厂。
侦听器和路由连接工厂
您可以配置SimpleMessageListenerContainer
使用路由连接工厂,以启用基于队列名称的连接选择。请参阅路由连接工厂。
RabbitTemplate
:RecoveryCallback
选择
这recoveryCallback
属性已添加,可在retryTemplate.execute()
. 请参阅添加重试功能。
MessageConversionException
改变
此异常现在是AmqpException
.
考虑以下代码:
try {
template.convertAndSend("thing1", "thing2", "cat");
}
catch (AmqpException e) {
...
}
catch (MessageConversionException e) {
...
}
第二个捕获块不再可访问,需要移动到捕获所有AmqpException
catch 块。
RabbitMQ 3.4 兼容性
Spring AMQP 现在与 RabbitMQ 3.4 兼容,包括直接回复。 有关更多信息,请参阅兼容性和 RabbitMQ 直接回复。
ContentTypeDelegatingMessageConverter
添加
这ContentTypeDelegatingMessageConverter
已引入以选择MessageConverter
使用,基于contentType
属性中的MessageProperties
.
有关详细信息,请参阅消息转换器。
C.2.14. 1.3 自 1.2 以来的变化
侦听器并发
侦听器容器现在支持根据工作负载动态缩放使用者数量,或者您可以以编程方式更改并发性,而无需停止容器。 请参阅侦听器并发。
侦听器队列
侦听器容器现在允许在运行时修改它侦听的队列。 此外,如果容器配置的队列中至少有一个可供使用,则容器现在将启动。 请参阅侦听器容器队列
此侦听器容器现在在启动期间重新声明任何自动删除队列。
看auto-delete
队列.
消费者优先
侦听器容器现在支持消费者参数,让x-priority
参数。
请参阅消费者优先级。
独家消费者
您现在可以配置SimpleMessageListenerContainer
与单个exclusive
consumer,阻止其他消费者监听队列。
请参阅独占消费者。
兔子管理员
您现在可以让代理生成队列名称,无论durable
,autoDelete
和exclusive
设置。
请参阅配置代理。
直接交换绑定
以前,省略key
属性binding
元素的direct-exchange
配置导致队列或交换与空字符串绑定为路由键。
现在它与提供的Queue
或Exchange
.
如果要使用空字符串路由键绑定,则需要指定key=""
.
AmqpTemplate
变化
这AmqpTemplate
现在提供多个同步receiveAndReply
方法。
这些是由RabbitTemplate
.
有关详细信息,请参阅接收消息。
这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
已添加到侦听器容器中。
此错误处理程序检测致命消息转换问题,并指示容器拒绝该消息,以防止代理不断重新传递不可转换的消息。
请参阅异常处理。
侦听器容器“missingQueuesFatal”属性(自 1.3.5 起)
这SimpleMessageListenerContainer
现在有一个名为missingQueuesFatal
(默认值:true
).
以前,缺少队列总是致命的。
请参阅消息侦听器容器配置。
C.2.15. 自 1.1 以来对 1.2 的更改
RabbitMQ 版本
Spring AMQP 现在默认使用 RabbitMQ 3.1.x(但保留与早期版本的兼容性)。
RabbitMQ 3.1.x 不再支持的功能添加了某些弃用 — 联合交换和immediate
属性RabbitTemplate
.
兔子管理员
RabbitAdmin
现在提供了一个选项,用于在声明失败时让交换、队列和绑定声明继续。
以前,所有声明都会在失败时停止。
通过设置ignore-declaration-exceptions
,则此类异常将被记录(在WARN
水平),但进一步的声明仍在继续。
这可能有用的一个示例是,当队列声明由于ttl
设置,通常会阻止其他声明继续进行。
RabbitAdmin
现在提供了一个名为getQueueProperties()
.
您可以使用此来确定代理上是否存在队列(返回null
对于不存在的队列)。
此外,它还返回队列中的当前消息数以及当前使用者数。
兔子模板
以前,当…sendAndReceive()
方法与固定应答队列一起使用,两个自定义标头用于相关数据以及保留和恢复应答队列信息。
在此版本中,标准消息属性 (correlationId
) 默认使用,但您可以指定要改用的自定义属性。
此外,嵌套的replyTo
信息现在保留在模板内部,而不是使用自定义标题。
这immediate
属性已弃用。使用 RabbitMQ 3.0.x 或更高版本时,不得设置此属性。
队列和其他项目的自动声明
以前,在声明队列、交换和绑定时,无法定义用于声明的连接工厂。
每RabbitAdmin
使用其连接声明所有组件。
从此版本开始,您现在可以将声明限制为特定的RabbitAdmin
实例。
请参阅条件声明。
AMQP 远程处理
现在提供了使用 Spring 远程处理技术的工具,使用 AMQP 作为 RPC 调用的传输。 有关详细信息,请参阅远程处理