ネットワークインタフェースに障害が発生した後にRabbitMQが接続を回復しようとすると、問題が発生します。 RMQへの接続を作成し、ネットワークインターフェイスがエミュレートできない(Centosのsudo ifdown enp0s3
)。ネットワーク障害後のRabbitMQ接続自動回復
要求されたハートビートタイムアウト後、私は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();
}
}
例外:
接続回復時に例外をキャッチ!
java.net.UnknownHostExceptionを発行: でjava.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)で java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184) でrmq.dev java.net com.rabbitmq.client.impl.FrameHandlerFactory.create(FrameHandlerFactory.java:32) com.rabbitmq.client.impl.recovery.RecoveryAwareAMQConnectionFactory.newConnection(RecoveryAwareAMQConnectionFactoryで で.Socket.connect(Socket.java:589)。 java:34) at com.rabbitmq.client.impl.recovery.AutorecoveringConnection.recoverConnection(AutorecoveringConnection.java:476) at c com.rabbitmqでom.rabbitmq.client.impl.recovery.AutorecoveringConnection.beginAutomaticRecovery(AutorecoveringConnection.java:444) で com.rabbitmq.client.impl.recovery.AutorecoveringConnection.access $ 000(AutorecoveringConnection.java:53) .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がホスト名を解決できない理由
conn = factory.newConnection()で試すことができますか。例外キャッチブロックの時点で新しい接続を作成する – maheeka
@maheeka残念ながら、別のAMQP接続スレッドから例外がスローされるため、残念ながらそれは効果がありません。 – Antonio
接続例外ハンドラを設定することができます。その方法では接続が発生して例外がスローされますが、そのような方法がないため接続を再開できません – Antonio