MQ JMS setClientReconnectOptions无法按预期工作?

时间:2013-01-20 01:03:49

标签: jms ibm-mq mq

我有一个简单的代码可以将2条消息放入队列中 1)我用两个服务器设置connectionNameList。
2)这两个服务器是独立的,但具有相同名称的队列管理器和队列,例如“QMgr”和“TEST.IN”
3)我设置了setClientReconnectOptions(WMQConstants.WMQ_CLIENT_RECONNECT);
我希望当第一台服务器关闭时,它应该将消息发送到第二台服务器。

我做的测试:
 a)我发送第一条消息,sender.send(消息);它奏效了。
 b)睡30秒     在此期间,我关闭了第一台服务器  c)然后完成睡眠,尝试发送第二条消息,但未能立即发送

此外,我尝试了更多,我尝试{} catch {}获取第二条消息,而在catch {}中,我尝试发送.send(消息),它仍然失败。

知道为什么它与我的预期不同。我将非常感谢您的回复。

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");
  }

1 个答案:

答案 0 :(得分:3)

这是最简单的测试用例,本来应该有效。你是如何打倒第一个队列管理器的?你有-r选项吗?请记住,如果没有-r选项,当使用endmqm命令结束队列管理器时,客户端将不会重新连接。

endmqm -r <qm name>

假设您使用了-r选项并且仍然无效,那么我的建议是尝试以下操作:

设置异常监听器以了解重新连接的情况。当连接断开并重新连接尝试开始直到重新连接成功或失败时,将调用异常监听器。异常监听器示例代码将是这样的:

conn.setExceptionListener(new ExceptionListener() {

  public void onException(JMSException e) {
    System.out.print(e);
  }
});