2016-11-30 4 views
0

Ich habe ein Problem, wenn RabbitMQ versucht, Verbindung wiederherzustellen, nachdem Netzwerkschnittstelle fehlschlägt. Ich erstelle Verbindung zu RMQ und emulieren Netzwerkschnittstelle fehlgeschlagen (sudo ifdown enp0s3 in Centos).RabbitMQ Verbindung Autorecovering nach Netzwerkausfall

Nach dem angeforderten Heartbeat-Timeout bekomme ich UnknownHostException. Es ist in Ordnung, weil ich nicht in/etc/hosts RMQ-Adresse habe.

Aber wenn ich Netzwerkschnittstelle starte (sudo ifup enp0s3) bekomme ich diese Erwartungen immer wieder. Verbindung wird nicht wiederhergestellt, nachdem die Netzwerkschnittstelle fehlgeschlagen ist.

Java-Version 1.8.0_60 AMQP-Client: 3.5.6

Code:

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(); 
     } 
    } 

Ausnahme:

eine Ausnahme während der Verbindung Erholung Gefangen!

java.net.UnknownHostException: rmq.dev bei java.net.AbstractPlainSocketImpl.connect (AbstractPlainSocketImpl.java:184) bei java.net.SocksSocketImpl.connect (SocksSocketImpl.java:392) bei java.net .Socket.connect (Socket.java:589) bei com.rabbitmq.client.impl.FrameHandlerFactory.create (FrameHandlerFactory.java:32) bei com.rabbitmq.client.impl.recovery.RecoveryAwareAMQConnectionFactory.newConnection (RecoveryAwareAMQConnectionFactory. java: 34) unter com.rabbitmq.client.impl.recovery.AutorecoveringConnection.recoverConnection (AutorecoveringConnection.java:476) unter c om.rabbitmq.client.impl.recovery.AutorecoveringConnection.beginAutomaticRecovery (AutorecoveringConnection.java:444) bei com.rabbitmq.client.impl.recovery.AutorecoveringConnection.access 000 $ (AutorecoveringConnection.java:53) bei com.rabbitmq .client.impl.recovery.AutorecoveringConnection $ 1.shutdownCompleted (AutorecoveringConnection.java:383) bei com.rabbitmq.client.impl.ShutdownNotifierComponent.notifyListeners (ShutdownNotifierComponent.java:75) bei com.rabbitmq.client.impl. AMQConnection $ MainLoop.run (AMQConnection.java:576) bei java.lang.Thread.run (Thread.java:745) Verbindung ist geöffnet: false, Kanal ist geöffnet: false

Kann mir jemand helfen? Warum kann Java den Hostnamen nach einem Netzwerkausfall nicht auflösen?

+0

Können Sie versuchen mit conn = factory.newConnection(); Erstellen einer neuen Verbindung an der Stelle des Ausnahme-Catch-Blocks – maheeka

+0

@maheeka Leider hat dies keine Auswirkungen, da Exception von einem anderen AMQP Connection Thread ausgelöst wird. – Antonio

+0

Ich kann nur Verbindung Ausnahme Handler setzen.In dieser Methode bekomme ich Verbindung und Ausnahme ausgelöst, aber ich kann die Verbindung nicht erneut öffnen, weil es keine solche Methode hat – Antonio

Antwort

0

Ein Problem mit RabbitMQ Wiederherstellung behoben durch periodische Auflösung InetAddress.getByName(HOST) außerhalb Amqp-Client. Aber ich verstehe nicht, warum diese Auflösung innerhalb InetSocketAddress Konstruktor nicht funktionieren kann. Irgendwelche Ideen? Gibt es eine bessere Lösung?

Verwandte Themen