2016-11-30 25 views
0

ネットワークインタフェースに障害が発生した後に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がホスト名を解決できない理由

+0

conn = factory.newConnection()で試すことができますか。例外キャッチブロックの時点で新しい接続を作成する – maheeka

+0

@maheeka残念ながら、別のAMQP接続スレッドから例外がスローされるため、残念ながらそれは効果がありません。 – Antonio

+0

接続例外ハンドラを設定することができます。その方法では接続が発生して例外がスローされますが、そのような方法がないため接続を再開できません – Antonio

答えて

0

Amqp-client以外の定期的な解決で修復されたRabbitMQの問題。InetAddress.getByName(HOST)しかし、なぜこの解決策が内部で働くことができないのかわかりませんInetSocketAddressコンストラクタ。 アイデアよりよい解決策が存在するか?

関連する問題