2016-02-24 3 views
0

У меня возникла проблема с параметром переключения времени ожидания. В принципе, я хочу, чтобы клиент отправлял сообщение брокеру, если брокер не работает, он попытается снова подключиться, пока брокер снова не появится. В то же время, отправка будет тайм-аут, поэтому он не будет ждать там навсегда.Время ожидания отказоустойчивости ActiveMQ работает случайно

Однако после некоторых тестов кажется, что тайм-аут не работает должным образом. Иногда, это таймаут, но иногда он просто висит там. Я знаю, что еще один вариант - maxReconnectAttempt. Но я хочу, чтобы он попытался снова соединиться.

Ниже URL я использую:

failover:(tcp://10.5.0.198:61616)?timeout=1000 

У меня есть система с двумя серверами. Один работает брокером, а один работает как клиент. Когда я переключить брокер, чтобы начать/остановить, я получаю сообщение журнала ниже:

We sent a Message! 
2016-02-24 20:29:06,967 [198:[email protected]] - WARN FailoverTransport - Transport (tcp://10.5.0.198:61616) failed, reason: java.io.EOFException, attempting to automatically reconnect 
Failover timeout of 1000 ms reached. 
Failover timeout of 1000 ms reached. 
Failover timeout of 1000 ms reached. 
Failover timeout of 1000 ms reached. 
Failover timeout of 1000 ms reached. 
Failover timeout of 1000 ms reached. 
We sent a Message! 
We sent a Message! 
We sent a Message! 
We sent a Message! 
We sent a Message! 
2016-02-24 20:29:48,688 [198:[email protected]] - WARN FailoverTransport - Transport (tcp://10.5.0.198:61616) failed, reason: java.io.EOFException, attempting to automatically reconnect 
We sent a Message! 
We sent a Message! 
We sent a Message! 
We sent a Message! 
We sent a Message! 
2016-02-24 21:57:50,777 [198:[email protected]] - WARN FailoverTransport - Transport (tcp://10.5.0.198:61616) failed, reason: java.io.EOFException, attempting to automatically reconnect 
Failover timeout of 1000 ms reached. 
Failover timeout of 1000 ms reached. 
Failover timeout of 1000 ms reached. 

Как вы можете видеть, второй раз, когда брокер вниз, он не таймаут в течение более одного часа.

Ниже приведен код, я использую:

private final String connectionUri = "failover:(tcp://10.5.0.198:61616)?timeout=1000"; 
private ActiveMQConnectionFactory connectionFactory; 
private Connection connection; 
private Session session; 
private Destination destination; 

public void before() throws Exception { 
    connectionFactory = new ActiveMQConnectionFactory(connectionUri); 
    connection = connectionFactory.createConnection(); 
    connection.start(); 
    session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
    destination = session.createQueue("MyQueue"); 
} 

public void after() throws Exception { 
    if (connection != null) { 
     connection.close(); 
    } 
} 

public void run() throws Exception { 

    MessageProducer producer = session.createProducer(destination); 
    try { 
     TextMessage message = session.createTextMessage(); 
     message.setText("We sent a Message!"); 
     producer.send(message); 
    } finally { 
     producer.close(); 
    } 

    MessageConsumer consumer = session.createConsumer(destination); 
    try { 
     TextMessage message = (TextMessage) consumer.receive(); 
     System.out.println(message.getText()); 
    } finally { 
     consumer.close(); 
    } 
} 
public static void main(String[] args) { 
    SimpleJMS example = new SimpleJMS(); 
    System.out.print("\n\n\n"); 
    System.out.println("Starting SimpleJMS example now..."); 
    try { 
     example.before(); 
     for(int i =0;i<1000;i++){ 
      Thread.sleep(1000); 
      try{ 
       example.run(); 
      } catch (Exception e){ 
       System.out.println(e.getMessage()); 
      } 
     } 
     example.after(); 
    } catch (Exception e) { 
     System.out.println("Caught an exception during the example: " + e.getMessage()); 
    } 
    System.out.println("Finished running the SimpleJMS example."); 
    System.out.print("\n\n\n"); 
} 

ответ

0

Я не мог понять это. После некоторых исследований, похоже, проблема с AMQ.

Итак, чтобы не блокировать все это, я переключился на сетевой брокер, который предоставляет локальный буфер, поэтому, когда он выполняет повтор, операция отправки будет продолжена.

Это лучшее решение, которое я могу найти сейчас.

Смежные вопросы