0

タイムアウト フェイルオーバー オプションの問題に直面しています。基本的に、ブローカーにメッセージを送信し続けるクライアントが必要です。ブローカーがダウンしている場合、ブローカーが再びアップするまで再接続を試みます。同時に、送信はタイムアウトするため、永遠に保留されることはありません。

ただし、いくつかのテストの後、タイムアウト オプションが正しく機能しないようです。タイムアウトすることもありますが、ハングアップすることもあります。別のオプションが 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");
}
4

2 に答える 2

0

私はこれを理解できませんでした。いくつかの調査の後、AMQ に問題があるようです。

したがって、すべてをブロックしないようにするために、ローカル バッファーを提供するネットワーク ブローカーに切り替えたので、再試行中に送信操作が続行されます。

これが今のところ私が見つけられる最善の解決策です。

于 2016-03-15T18:24:17.713 に答える