我正在使用rabbitmq java client 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.
}
谢谢。
答案 0 :(得分:4)
如果您的客户端失去与您的代理的TCP连接,则该连接被视为“已关闭”。因此,客户端库抛出AlreadyClosedException
是合适的(而不是错误)。
换句话说,无论它如何关闭(通过优雅的方式或通过意外的失败),连接都被视为“关闭”。