网络故障后RabbitMQ连接自动恢复

问题描述:

当网络接口故障后,RabbitMQ尝试恢复连接时出现问题。 我创建连接到RMQ并模拟网络接口失败(Centos中的sudo ifdown enp0s3)。网络故障后RabbitMQ连接自动恢复

在请求的心跳超时后,我得到UnknownHostException。没关系,因为我没有在/ etc/hosts RMQ地址。

但是,当我启动网络接口(sudo ifup enp0s3),我一次又一次地得到这个expons。网络接口失败后,连接不会恢复。

Java版本1.8.0_60 AMQP的客户端:3.5.6

代码:

ConnectionFactory factory = new ConnectionFactory(); 
    Connection conn = null; 
    Channel channel = null; 

    factory.setUsername(USERNAME); 
    factory.setPassword(PASSWORD); 
    factory.setVirtualHost(VIRTUAL_HOST); 
    factory.setHost(HOST); 
    factory.setPort(PORT); 
    factory.setRequestedHeartbeat(4); 
    // auto-recovery 
    factory.setAutomaticRecoveryEnabled(true); 
    factory.setNetworkRecoveryInterval(5000); 

    try { 
     conn = factory.newConnection(); 
     channel = conn.createChannel(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return; 
    } 

    while (true) { 
     try { 
      Thread.sleep(5000); 
      System.out.println(String.format("Connection is opened: %s", conn.isOpen())); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

例外:

连接抓到恢复过程中的异常!

的java.net.UnknownHostException:rmq.dev在 java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184) 在java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)在 java.net .Socket.connect(Socket.java:589)在 com.rabbitmq.client.impl.FrameHandlerFactory.create(FrameHandlerFactory.java:32) 在 com.rabbitmq.client.impl.recovery.RecoveryAwareAMQConnectionFactory.newConnection(RecoveryAwareAMQConnectionFactory。 java:34) at com.rabbitmq.client.impl.recovery.AutorecoveringConnection.recoverConnection(AutorecoveringConnection.java:476) at c om.rabbitmq.client.impl.recovery.AutorecoveringConnection.beginAutomaticRecovery(AutorecoveringConnection.java:444) 在 com.rabbitmq.client.impl.recovery.AutorecoveringConnection.access $ 000(AutorecoveringConnection.java:53) 在 com.rabbitmq .client.impl.recovery.AutorecoveringConnection $ 1.shutdownCompleted(AutorecoveringConnection.java:383) 在 com.rabbitmq.client.impl.ShutdownNotifierComponent.notifyListeners(ShutdownNotifierComponent.java:75) 在 com.rabbitmq.client.impl。 AMQConnection $ MainLoop.run(AMQConnection.java:576) at java.lang.Thread.run(Thread.java:745)打开连接:false, 通道打开:false

任何人都可以帮助我吗?为什么Java在网络失败后无法解析主机名?

+0

你可以试试conn = factory.newConnection();在异常捕获块 – maheeka

+0

@maheeka处创建新连接不幸的是,它没有任何作用,因为异常是从另一个AMQP连接线程抛出的。 – Antonio

+0

我可以只设置连接异常处理程序。在那种方法中,我得到连接并抛出异常,但我无法重新打开连接,因为它没有这种方法 – Antonio

RabbitMQ通过周期性地在Amqp客户端以外解析InetAddress.getByName(HOST)修复问题。但我不明白为什么这个解决方案不能在InetSocketAddress构造函数中工作。 任何想法?是否存在更好的解决方案?