2016-11-30 6 views
0

네트워크 인터페이스가 실패한 후 RabbitMQ가 연결 복구를 시도 할 때 문제가 있습니다. RMQ에 대한 연결을 만들고 네트워크 인터페이스 에뮬레이션에 실패했습니다 (Centos에서 sudo ifdown enp0s3).네트워크 실패 후 RabbitMQ 연결 자동 복구

요청한 하트 비트 시간 초과 후 UnknownHostException이 표시됩니다./etc/hosts RMQ 주소가 없기 때문에 괜찮습니다.

하지만 네트워크 인터페이스 (sudo ifup enp0s3)를 시작할 때 나는이 시험을 몇 번이나 반복하고 있습니다. 네트워크 인터페이스 실패 후 연결이 복구되지 않습니다.

자바 버전 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 .Socket.connect com.rabbitmq.client.impl.recovery.RecoveryAwareAMQConnectionFactory.newConnection에서 com.rabbitmq.client.impl.FrameHandlerFactory.create (FrameHandlerFactory.java:32)에서 (Socket.java:589) (RecoveryAwareAMQConnectionFactory. 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 생성자 내부에서 작동하지 않을 수 있는지 이해가 안돼. 아이디어가 있으십니까? 더 나은 해결책이 존재합니까?