我正在使用 spring-multirabbit 配置与 2 个独立的rabbitmq 服务器的连接。
spring:
multirabbitmq:
enabled: true
defaultConnection: first-connection
connections:
first-connection:
host: localhost
port: 5672
username: guest
password: guest
second-connection:
host: localhost
port: 5672
username: guest
password: guest
对于本地测试,我将它们都放在本地主机上,但让我们假设它们是 2 个远程服务器。在默认连接上,我仅使用队列之间进行 1:1 通信的直接交换。在第二个连接上,我有一个主题交换、一个生产者和多个消费者。在第二个连接上,如果侦听器进入异常,则重试会无限进行。
我已经测试过,如果我删除多兔子配置并使用同一服务器进行直接交换和主题交换,我不会得到这种无限重试行为。它重试 3 次,这是通过属性配置的:
spring.rabbitmq.listener.simple.retry.enabled=true
spring.rabbitmq.listener.simple.retry.initial-interval=1000
spring.rabbitmq.listener.simple.retry.max-attempts=3
很明显,问题来自 multirabbitmq 库。有人有这方面的经验吗?如何覆盖/修复第二个连接上的重试行为?这是库中的已知错误吗?
我发现了这个 github 问题,但对建议的解决方案没有运气。
根据当前代码库中的逻辑,我们无法为每个连接工厂进行重试配置:
/**
* Registers the ContainerFactory bean.
*/
private SimpleRabbitListenerContainerFactory newContainerFactory(final ConnectionFactory connectionFactory) {
final SimpleRabbitListenerContainerFactory containerFactory = new SimpleRabbitListenerContainerFactory();
containerFactory.setConnectionFactory(connectionFactory);
return containerFactory;
}
因此,他们根据特定的连接工厂创建一个简单的
SimpleRabbitListenerContainerFactory
,但每个连接工厂都深入研究 RabbitProperties
的其余部分。
查看 Spring AMQP 中对 multi-rabbit 的一些官方支持:https://docs.spring.io/spring-amqp/docs/current/reference/html/#multi-rabbit
由于此功能没有干净、直接的自动配置,我建议您研究一下
setRetryTemplate()
中的 SimpleRabbitListenerContainerFactory
,您必须为每个连接工厂进行配置。