当代理连接丢失时,RabbitMQ抛出AlreadyClosedException而不是IOException

时间:2011-04-28 08:39:43

标签: rabbitmq

我正在使用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.
           }

谢谢。

1 个答案:

答案 0 :(得分:4)

如果您的客户端失去与您的代理的TCP连接,则该连接被视为“已关闭”。因此,客户端库抛出AlreadyClosedException是合适的(而不是错误)。

换句话说,无论它如何关闭(通过优雅的方式或通过意外的失败),连接都被视为“关闭”。