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

标签 java spring rabbitmq spring-amqp

我们在绑定(bind)到 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)

看来,org.springframework.amqp.rabbit.connection.AbstractConnectionFactorycom.rabbitmq.client.RecoveryListener接口(interface)的实现无论如何都会无条件关闭连接其“打开”状态。

@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

谢谢

最佳答案

您不应该在 Spring 中使用自动恢复;它始终拥有自己的恢复机制,早于 amqp 客户端数年。

有一些奇怪的极端情况,我们无法与之共存,最终会成为孤立的消费者。多年来,我们多次尝试修补它,但最终放弃了,现在只是在恢复开始之前停止它。

关于java - 使用 Spring AMQP 自动恢复 AMQP 连接期间的 AlreadyClosedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58697231/

相关文章:

java - 将 ResultSet 转换为 int 数组

java - Java线程: 'join' froze my program

java - 尝试在 spring 中保留消息属性文件列表时出错

java - DataSource.getConnection 方法在数据库重新启动或理想超时后返回已关闭的连接

database - 消息代理与数据库和监控

java - IntelliJ 中字符串内的大括号匹配

Java:继承与依赖注入(inject) "Autowired"

javax.inject.Named 使用动态名称

java - 防止RabbitMQ阻塞上游服务

python - Ping MySQL 以在 Django 中保持连接