3

2 つのメッセージをキューに入れる簡単なコードがあります。
1) 2 つのサーバーで connectionNameList を設定しました。
2) これら 2 つのサーバーは独立していますが、「QMgr」や「TEST.IN」など、同じ名前で定義された同じキュー マネージャーとキューがあります。
3) setClientReconnectOptions(WMQConstants.WMQ_CLIENT_RECONNECT);
  最初のサーバーがダウンしたときに、メッセージが 2 番目のサーバーに送信されることを願っています。

私が行ったテスト:
a) 最初のメッセージ、sender.send(message); を送信します。出来た。
b) 30 秒間スリープします。
この間、最初のサーバーをシャットダウンしました
c) その後、スリープ状態になり、2 番目のメッセージを送信しようとしましたが、すぐに送信できませんでした

さらに、さらに試してみました。2 番目のメッセージに対して {} catch{} を試しました。catch{} で、sender.send(message) を試みましたが、まだ失敗しています。

私が期待したものとは異なる理由を考えてください。返信をお待ちしております。

public static void main(String[] args) throws Exception
{
    MQQueueConnectionFactory cf = new MQQueueConnectionFactory();
    cf.setConnectionNameList("10.230.34.191(1418),10.230.34.169(1418)");

    cf.setQueueManager("QMgr");
    cf.setTransportType(WMQConstants.WMQ_CM_CLIENT);
    cf.setClientReconnectOptions(WMQConstants.WMQ_CLIENT_RECONNECT);
    cf.setClientReconnectTimeout(600);

    System.out.println("connect list " + cf.getConnectionNameList());

    MQQueueConnection connection = (MQQueueConnection) cf
            .createQueueConnection("mqm", "passwd");
    MQQueueSession session = (MQQueueSession) connection.createQueueSession(false,
            Session.AUTO_ACKNOWLEDGE);
    MQQueue queue = (MQQueue) session.createQueue("queue:///TEST.IN");
    MQQueueSender sender = (MQQueueSender) session.createSender(queue);

    long uniqueNumber = System.currentTimeMillis() % 1000;
    JMSTextMessage message = (JMSTextMessage) session.createTextMessage("SimplePTP "
            + uniqueNumber);

    // Start the connection
    connection.start();

    sender.send(message);
    System.out.println("Sent message:\\n" + message);

    System.out.println("sleep 30 seconds");
    Thread.sleep(30000);
    uniqueNumber = System.currentTimeMillis() % 1000;
    message = (JMSTextMessage) session.createTextMessage("SimplePTP " + uniqueNumber);
    sender.send(message);

    sender.close();
    session.close();
    connection.close();

    System.out.println("\\nSUCCESS\\n");
  }
4

1 に答える 1

3

これは最も単純なテストケースであり、うまくいくはずです。最初のキュー・マネージャーをどのようにダウンさせましたか? オプションで落としました-r。この-rオプションがないと、キュー マネージャーがendmqmコマンドで終了したときにクライアントが再接続しないことに注意してください。

endmqm -r <qm name>

オプションを使用しても機能しないと仮定する-rと、次のことを試すことをお勧めします。

例外リスナーを設定して、再接続で何が起こっているかを把握します。例外リスナーは、接続が切断されたときに呼び出され、再接続が成功するか失敗するまで再接続の試行が開始されます。例外リスナーのサンプル コードは次のようになります。

conn.setExceptionListener(new ExceptionListener() {

  public void onException(JMSException e) {
    System.out.print(e);
  }
});
于 2013-01-21T04:36:17.893 に答える