タイムアウト フェイルオーバー オプションの問題に直面しています。基本的に、ブローカーにメッセージを送信し続けるクライアントが必要です。ブローカーがダウンしている場合、ブローカーが再びアップするまで再接続を試みます。同時に、送信はタイムアウトするため、永遠に保留されることはありません。
ただし、いくつかのテストの後、タイムアウト オプションが正しく機能しないようです。タイムアウトすることもありますが、ハングアップすることもあります。別のオプションが maxReconnectAttempt であることは知っています。しかし、問題は、永遠に再接続しようとすることです。
以下は私が使用しているURLです:
failover:(tcp://10.5.0.198:61616)?timeout=1000
2 サーバー システムを使用しています。1 つはブローカーとして機能し、もう 1 つはクライアントとして機能します。ブローカーの開始/停止を切り替えると、以下のログ メッセージが表示されます。
We sent a Message!
2016-02-24 20:29:06,967 [198:61616@17075] - 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:61616@17099] - 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:61616@18542] - 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.
ご覧のとおり、ブローカが 2 回目にダウンしたときは、1 時間以上タイムアウトしませんでした。
以下は私が使用しているコードです:
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");
}