网络故障后 RabbitMQ 连接自动恢复
RabbitMQ connection autorecovering after network fails
当 RabbitMQ 在网络接口失败后尝试恢复连接时遇到问题。
我创建与 RMQ 的连接并模拟网络接口失败(Centos 中的 sudo ifdown enp0s3
)。
请求心跳超时后,我收到 UnknownHostException。没关系,因为我没有 /etc/hosts RMQ 地址。
但是当我启动网络接口 (sudo ifup enp0s3
) 时,我一次又一次地收到此错误消息。网络接口出现故障后连接无法恢复。
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();
}
}
异常:
Caught an exception during connection recovery!
java.net.UnknownHostException: rmq.dev at
java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at
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[=13=]0(AutorecoveringConnection.java:53)
at
com.rabbitmq.client.impl.recovery.AutorecoveringConnection.shutdownCompleted(AutorecoveringConnection.java:383)
at
com.rabbitmq.client.impl.ShutdownNotifierComponent.notifyListeners(ShutdownNotifierComponent.java:75)
at
com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:576)
at java.lang.Thread.run(Thread.java:745) Connection is opened: false,
channel is opened: false
有人可以帮助我吗?为什么 Java 在网络出现故障后无法解析主机名?
RabbitMQ 通过在 Amqp-client 外部定期解析 InetAddress.getByName(HOST)
来恢复修复的问题。但是我不明白为什么这个解析不能在 InetSocketAddress
构造函数中工作。
有任何想法吗?有没有更好的解决方案?
当 RabbitMQ 在网络接口失败后尝试恢复连接时遇到问题。
我创建与 RMQ 的连接并模拟网络接口失败(Centos 中的 sudo ifdown enp0s3
)。
请求心跳超时后,我收到 UnknownHostException。没关系,因为我没有 /etc/hosts RMQ 地址。
但是当我启动网络接口 (sudo ifup enp0s3
) 时,我一次又一次地收到此错误消息。网络接口出现故障后连接无法恢复。
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();
}
}
异常:
Caught an exception during connection recovery!
java.net.UnknownHostException: rmq.dev at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at 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[=13=]0(AutorecoveringConnection.java:53) at com.rabbitmq.client.impl.recovery.AutorecoveringConnection.shutdownCompleted(AutorecoveringConnection.java:383) at com.rabbitmq.client.impl.ShutdownNotifierComponent.notifyListeners(ShutdownNotifierComponent.java:75) at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:576) at java.lang.Thread.run(Thread.java:745) Connection is opened: false, channel is opened: false
有人可以帮助我吗?为什么 Java 在网络出现故障后无法解析主机名?
RabbitMQ 通过在 Amqp-client 外部定期解析 InetAddress.getByName(HOST)
来恢复修复的问题。但是我不明白为什么这个解析不能在 InetSocketAddress
构造函数中工作。
有任何想法吗?有没有更好的解决方案?