spring-rabbit 1.7.2+ autorecovery broken?

时间:2017-07-07 08:01:11

标签: scala spring-rabbit

从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)
}

1 个答案:

答案 0 :(得分:0)

Spring AMQP自第1天起就有自己的恢复机制;它早于客户端库中的自动恢复几年。

如果使用构造函数创建一个带有预配置RabbitMQ CachingConnectionFactory的{​​{1}},我们会发出此消息...

ConnectionFactory

当您按照自己的方式设置选项时,我们当然无法检测到该选项并且不会发出该消息。

通常,Spring AMQP(在发送端)将更快地恢复连接,消费者端的恢复具有与客户端类似的特性(使用默认配置)。

也就是说,正如日志消息所示,使用自动恢复不会对任何事情造成伤害,只会导致生产者方面的恢复延迟。

我没有看到你描述的行为;也许它与你使用Scala或你环境中的其他东西有关;如果您真的必须出于某种原因使用客户端的自动恢复,那么跨越关闭/重启和失败恢复的DEBUG日志将非常有用。