首页 文章

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

提问于
浏览
0

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

请求心跳超时后,我收到UnknownHostException . 没关系,因为我没有/ etc / hosts RMQ地址 .

但是当我启动网络接口( sudo ifup enp0s3 )时,我会在网络接口出现故障后恢复 .

Java版本1.8.0_60 amqp-client:3.5.6

Code:

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();
        }
    }

Exception:

在连接恢复期间发现异常! java.net.UnknownHostException:java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184)中的rmq.dev,java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392),java.net.Socket.connect(Socket . java:589)at com.rabbitmq.client.impl.FrameHandlerFactory.create(FrameHandlerFactory.java:32)at com.rabbitmq.client.impl.recovery.RecoveryAwareAMQConnectionFactory.newConnection(RecoveryAwareAMQConnectionFactory.java:34)at com.rabbitmq.client .impl.recovery.AutorecoveringConnection.recoverConnection(AutorecoveringConnection.java:476)at com.rabbitmq.client.impl.recovery.AutorecoveringConnection.beginAutomaticRecovery(AutorecoveringConnection.java:444)at com.rabbitmq.client.impl.recovery.AutorecoveringConnection.access $ com(AutorecoveringConnection.java:53)at com.rabbitmq.client.impl.recovery.AutorecoveringConnection $ 1.shutdownCompleted(AutorecoveringConnection.java:383)at com.rabbitmq.client.impl.ShutdownNotifierComponent.notifyListeners(ShutdownNotifierComponent.java:75)a t com.rabbitmq.client.impl.AMQConnection $ MainLoop.run(AMQConnection.java:576)at java.lang.Thread.run(Thread.java:745)连接打开:false,通道打开:false

有谁能够帮我?为什么Java在网络出现故障后无法解析主机名?

1 回答

  • 0

    RabbitMQ通过在Amqp-client之外定期解析 InetAddress.getByName(HOST) 来恢复修复的问题 . 但我不是 InetSocketAddressInetSocketAddress 构造函数内工作 . 有任何想法吗?有没有更好的解决方案?

相关问题