提问者:小点点

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


当RabbitMQ在网络接口失败后尝试恢复连接时,我遇到了问题。我创建到RMQ的连接并模拟网络接口失败(Centos中的sudo ifdown enp0s3)。

请求心跳超时后,我得到了未知的异常。没关系,因为我没有 /etc/hostsRMQ地址。

但是当我启动网络接口(sudo ifup enp0s3)时,我一次又一次地收到这个请求。网络接口失败后连接无法恢复。

Java版本1.8.0_60amqp-client: 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不能解析主机名?


共1个答案

匿名用户

RabbitMQ通过在Amqp-client之外定期解析InetAddres. getByName(HOST)来恢复修复的问题。但是我不明白为什么这种解析不能在InetSocketAddress构造函数中工作。有什么想法吗?有没有更好的解决方案?