AlreadyClosedException при автоматическом восстановлении AMQP-соединений с использованием Spring AMQP - PullRequest
0 голосов
/ 04 ноября 2019

В журналах наших Java-приложений, связанных с экземпляром Rabbit MQ, мы встречаемся со следующим исключением:

Это то, о чем нужно позаботиться, обозначая проблему в реализации 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-amqp и spring-rabbit версии 1.7.14

Спасибо,

1 Ответ

1 голос
/ 04 ноября 2019

Вы не должны использовать авто восстановление с Spring;у него всегда были свои собственные механизмы восстановления, за годы до клиента amqp.

Есть некоторые странные случаи, когда мы не можем сосуществовать с ним и в конечном итоге оказаться осиротевшими потребителями. Мы пытались обойти его несколько раз за эти годы, но отказались и теперь просто остановили восстановление до его запуска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...