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