RabbitMQ выдает исключение AlreadyClosedException вместо IOException при потере соединения с брокером

#rabbitmq

#rabbitmq

Вопрос:

Я использую Java-клиент rabbitmq 2.4.1 новейшей версии.

После потери TCP-соединения и все еще вызова метода на канале через это соединение будет выдано исключение AlreadyClosedException.

Это ошибка? Я ожидал исключение IOException, но я получил исключение AlreadyClosedException, а исключение AlreadyClosedException — это исключение RuntimeException.

Если нет, то почему все другие ошибки вызывают исключение IOException.

  @Test
 public void testConnectionLost() throws IOException{
           ConnectionFactory factory = new ConnectionFactory();
           factory.setRequestedHeartbeat(60);
           factory.setHost("<your rabbitmq host>");


           Connection connection = factory.newConnection();
           Channel channel = connection.createChannel();
           connection.close();

           try {
                   channel.queueDeclare("queueName", false, false, false, null);
                   Assert.fail("Exception expected.");
           }catch (IOException e) {
                   //it will NOT reach here.
                   //Inner exception should be AlreadyClosedException
                   System.out.println(e);
           }catch (AlreadyClosedException e) {
                   // it will reach here.
                   System.out.println(e);

                   //this is strange!
                   //I expected IOException , but AlreadyClosedException I got.
                   //And AlreadyClosedException is a RuntimeException.
           }
  

Спасибо.

Ответ №1:

Если ваш клиент теряет TCP-соединение с вашим брокером, соединение считается «закрытым». Поэтому для клиентской библиотеки является уместным (а не ошибкой) выдавать AlreadyClosedException .

Другими словами, соединение считается «закрытым» независимо от того, как оно было закрыто (либо изящным образом, либо из-за неожиданного сбоя).