У меня возникла проблема с параметром переключения времени ожидания. В принципе, я хочу, чтобы клиент отправлял сообщение брокеру, если брокер не работает, он попытается снова подключиться, пока брокер снова не появится. В то же время, отправка будет тайм-аут, поэтому он не будет ждать там навсегда.Время ожидания отказоустойчивости 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");
}