1.5 自 1.4 以来的变更
不再支持 spring-erlang
发行版中不再包含 spring-erlang jar。请改用RabbitMQ REST API。
CachingConnectionFactory 变更
CachingConnectionFactory 中的空 addresses 属性
此前,如果连接工厂配置了 host 和 port,但同时为 addresses 提供了空字符串,则 host 和 port 会被忽略。现在,空的 addresses 字符串被视为与 null 相同,从而使用 host 和 port。
URI 构造函数
CachingConnectionFactory 新增了一个带 URI 参数的构造函数,用于配置 broker 连接。
连接重置
新增了名为 resetConnection() 的方法,让用户可以重置连接(或多个连接)。例如,你可以在故障转移到次级 broker 之后,用它重新连接主 broker。这确实会影响进程内操作。现有的 destroy() 方法作用完全相同,但新方法的名称更友好。
控制容器队列声明行为的属性
当 listener 容器的 consumer 启动时,它们会尝试被动声明队列,以确保这些队列在 broker 上可用。此前,如果这些声明失败(例如因为队列不存在)或正在移动 HA 队列时,重试逻辑固定为以 5 秒间隔重试三次。如果队列仍然不存在,则由 missingQueuesFatal 属性控制行为(默认值:true)。此外,对于配置为监听多个队列的容器,如果只有一部分队列可用,consumer 会以固定的 60 秒间隔重试缺失队列。
现在 declarationRetries、failedDeclarationRetryInterval 和 retryDeclarationInterval 属性可配置。更多信息参见消息 Listener 容器配置。
类包变更
RabbitGatewaySupport 类已从 o.s.amqp.rabbit.core.support 移到 o.s.amqp.rabbit.core。
DefaultMessagePropertiesConverter 变更
现在可以配置 DefaultMessagePropertiesConverter,以决定转换为 String(而非 DataInputStream)的 LongString 的最大长度。该转换器有一个接收该值作为上限的备用构造函数。此前,此上限硬编码为 1024 字节。(1.4.4 中也已提供。)
@RabbitListener 改进
用于 @RabbitListener 的 @QueueBinding
@RabbitListener 注解新增了 bindings 属性,它与 queues 属性互斥,用于指定 queue、其 exchange 和 binding,以便由 broker 上的 RabbitAdmin 进行声明。
@SendTo 中的 SpEL
@RabbitListener 的默认回复地址(@SendTo)现在可以是 SpEL 表达式。
通过属性指定多个队列名
现在可以组合使用 SpEL 和属性占位符,为 listener 指定多个队列。
更多信息参见注解驱动的 Listener 端点。
自动声明 Exchange、Queue 与 Binding
现在可以声明定义这些实体集合的 Bean,RabbitAdmin 会在建立连接时将其内容加入它所声明的实体列表。更多信息参见声明 Exchange、Queue 与 Binding 的集合。
RabbitTemplate 变更
新增 reply-address
<rabbit-template> 组件新增了 reply-address 属性,作为 reply-queue 的替代。更多信息参见请求/回复消息传递。(1.4.4 中也已作为 RabbitTemplate 上的 setter 提供。)
阻塞式 receive 方法
RabbitTemplate 现在在 receive 和 convertAndReceive 方法中支持阻塞。更多信息参见轮询 Consumer。
sendAndReceive 方法中的 mandatory
在使用 sendAndReceive 和 convertSendAndReceive 方法时设置了 mandatory 标志后,如果请求消息无法投递,调用线程会抛出 AmqpMessageReturnedException。更多信息参见回复超时。
不当的回复 Listener 配置
在使用命名回复队列时,框架会尝试验证回复 listener 容器的配置是否正确。
更多信息参见回复 Listener 容器。
新增 RabbitManagementTemplate
引入了 RabbitManagementTemplate,通过其管理插件提供的 REST API 来监控和配置 RabbitMQ Broker。更多信息参见RabbitMQ REST API。
Listener 容器 Bean 名称(XML)
<listener-container/> 元素上的 id 属性已被移除。从本版本开始,仅使用 <listener/> 子元素上的 id 来为每个 listener 元素所创建的 listener 容器 Bean 命名。
正常的 Spring Bean 名称覆盖规则仍然适用。如果后续解析的 <listener/> 与已有 Bean 具有相同的 id,则新定义会覆盖已有定义。此前,Bean 名称由 <listener-container/> 和 <listener/> 元素的 id 属性组合而成。
迁移到本版本时,如果你的 <listener-container/> 元素上有 id 属性,请将其移除,改为在子元素 <listener/> 上设置 id。
不过,为支持成组地启动和停止容器,新增了 group 属性。当定义了此属性时,由该元素创建的容器会被加入一个以此名称命名、类型为 Collection<SimpleMessageListenerContainer> 的 Bean。你可以遍历该组来启动和停止容器。
类级别的 @RabbitListener
@RabbitListener 注解现在可以应用于类级别。结合新的 @RabbitHandler 方法注解,这让你能够根据负载类型选择处理方法。更多信息参见多方法 Listener。
SimpleMessageListenerContainer:BackOff 支持
现在可以为 SimpleMessageListenerContainer 提供一个 BackOff 实例,用于 consumer 启动恢复。更多信息参见消息 Listener 容器配置。
Channel 关闭日志
引入了一种控制 channel 关闭日志级别的机制。参见记录 Channel 关闭事件。
应用事件
当 consumer 失败时,SimpleMessageListenerContainer 现在会发出应用事件。更多信息参见Consumer 事件。
Consumer Tag 配置
此前,异步 consumer 的 consumer tag 由 broker 生成。从本版本开始,可以为 listener 容器提供命名策略。参见Consumer Tag。
使用 MessageListenerAdapter
MessageListenerAdapter 现在支持一个队列名(或 consumer tag)到方法名的映射,以根据消息来源队列决定调用哪个委托方法。
新增 LocalizedQueueConnectionFactory
LocalizedQueueConnectionFactory 是一个新的连接工厂,它连接到集群中镜像队列实际所在的节点。
匿名队列命名
从 1.5.3 版本开始,现在可以控制 AnonymousQueue 名称的生成方式。更多信息参见AnonymousQueue。