使用Spring AMQP自动恢复AMQP连接期间的AlreadyClosedException

在绑定到Rabbit MQ实例的Java应用程序的日志中,我们遇到以下异常的情况。

这是必须要解决的问题,它表示Spring AMQP的实现中存在问题,还是可以忽略的事情?在后一种情况下,此类错误的根本原因是什么?

com.rabbitmq.client.AlreadyClosedException: connection is already closed due to connection error; protocol method: #method<connection.close>(reply-code=320,reply-text=CONNECTION_FORCED - broker forced connection closure with reason 'shutdown',class-id=0,method-id=0)
   at com.rabbitmq.client.impl.AMQConnection.startShutdown(AMQConnection.java:927)
   at com.rabbitmq.client.impl.AMQConnection.close(AMQConnection.java:1042)
   at com.rabbitmq.client.impl.AMQConnection.close(AMQConnection.java:971)
   at com.rabbitmq.client.impl.AMQConnection.close(AMQConnection.java:955)
   at com.rabbitmq.client.impl.recovery.AutorecoveringConnection.close(AutorecoveringConnection.java:305)
   at org.springframework.amqp.rabbit.connection.SimpleConnection.close(SimpleConnection.java:76)
   at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory$3.handleRecovery(AbstractConnectionFactory.java:389)
   at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory$3.handleRecoveryStarted(AbstractConnectionFactory.java:383)
   at com.rabbitmq.client.impl.recovery.AutorecoveringConnection.notifyRecoveryListenersStarted(AutorecoveringConnection.java:652)
   at com.rabbitmq.client.impl.recovery.AutorecoveringConnection.beginAutomaticRecovery(AutorecoveringConnection.java:570)
   at com.rabbitmq.client.impl.recovery.AutorecoveringConnection.access$000(AutorecoveringConnection.java:63)
   at com.rabbitmq.client.impl.recovery.AutorecoveringConnection$3.recoveryCanBegin(AutorecoveringConnection.java:513)
   at com.rabbitmq.client.impl.AMQConnection.notifyRecoveryCanBeginListeners(AMQConnection.java:754)
   at com.rabbitmq.client.impl.AMQConnection.doFinalShutdown(AMQConnection.java:731)
   at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:615)
   at java.base/java.lang.Thread.run(Unknown Source)

似乎com.rabbitmq.client.RecoveryListener中的org.springframework.amqp.rabbit.connection.AbstractConnectionFactory接口的实现无条件地关闭了连接,无论其处于“打开”状态。

@Override
public void handleRecoveryStarted(Recoverable recoverable) {
   handleRecovery(recoverable);
}

@Override
public void handleRecovery(Recoverable recoverable) {
   try {
      connection.close();
   }
   catch (Exception e) {
      AbstractConnectionFactory.this.logger.error("Failed to close auto-recover connection",e);
   }
}

spring-amqpspring-rabbit版本是1.7.14

谢谢

mayflow 回答:使用Spring AMQP自动恢复AMQP连接期间的AlreadyClosedException

您不应在Spring中使用自动恢复;它比amqp客户端早几年就拥有自己的恢复机制。

在一些奇怪的极端情况下,我们无法与之共存并最终成为孤立的消费者。多年来,我们试图对其进行修补,但是放弃了,现在只是在恢复开始之前就停止了恢复。

本文链接:https://www.f2er.com/3165317.html

大家都在问