#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
.
Другими словами, соединение считается «закрытым» независимо от того, как оно было закрыто (либо изящным образом, либо из-за неожиданного сбоя).