从spring-rabbit 1.7.2开始,连接自动恢复是否可能被破坏?
听众的测试成功,直到将spring-rabbit升级到1.7.2。下一个版本1.7.3也失败了。测试很简单:启动监听器,停止RabbitMQ服务器,启动Rabbit MQ服务器并观察监听器获取消息。
然而,奇怪的是,当不调用" setAutomaticRecoveryEnabled()"时,自动恢复适用于1.7.2及更高版本。或者使用 false 调用它。哪个应该禁用自动恢复。
Spring配置(在Scala中)
@Configuration
@ComponentScan(Array("com.foo"))
@EnableRabbit
class AMQPConfig {
@Bean
def rabbitListenerContainerFactory: SimpleRabbitListenerContainerFactory = {
val factory = new SimpleRabbitListenerContainerFactory
factory.setConnectionFactory(connectionFactory())
factory.setConcurrentConsumers(1)
factory.setMaxConcurrentConsumers(1)
factory
}
@Bean
def rabbitTemplate(): RabbitTemplate = {
val template = new RabbitTemplate(connectionFactory())
template.setRoutingKey("key")
template.setExchange("xchange")
template
}
@Bean
def connectionFactory(): ConnectionFactory = {
val factory = new CachingConnectionFactory("localhost")
factory.setUsername("foo")
factory.setPassword("bar")
factory.setVirtualHost("fooman")
factory.setPort(5672)
factory.getRabbitConnectionFactory.setAutomaticRecoveryEnabled(true)
factory.getRabbitConnectionFactory.setRequestedHeartbeat(120)
factory
}
}
听众
@Component
class QueueListener {
@RabbitListener(id = "listen", containerFactory = "rabbitListenerContainerFactory", queues = Array("q"))
def onMessage(message: String): Unit = {
QueueListener.count.incrementAndGet()
println("GOT MESSAGE: " + message)
}
}
object QueueListener {
val count = new AtomicInteger(0)
}
答案 0 :(得分:0)
Spring AMQP自第1天起就有自己的恢复机制;它早于客户端库中的自动恢复几年。
如果使用构造函数创建一个带有预配置RabbitMQ CachingConnectionFactory
的{{1}},我们会发出此消息...
ConnectionFactory
当您按照自己的方式设置选项时,我们当然无法检测到该选项并且不会发出该消息。
通常,Spring AMQP(在发送端)将更快地恢复连接,消费者端的恢复具有与客户端类似的特性(使用默认配置)。
也就是说,正如日志消息所示,使用自动恢复不会对任何事情造成伤害,只会导致生产者方面的恢复延迟。
我没有看到你描述的行为;也许它与你使用Scala或你环境中的其他东西有关;如果您真的必须出于某种原因使用客户端的自动恢复,那么跨越关闭/重启和失败恢复的DEBUG日志将非常有用。