IBM MQ:获取连接中断通知的任何方式?

时间:2016-03-17 12:36:50

标签: java jms ibm-mq

我正在使用IBM MQ-7.5。我正在运行一个jms客户端,它连接到在其他主机上运行的管理器。

我想监视与管理器的TCP连接。如果管理员断开我的客户端连接,如何收到通知? IBM MQ API中是否提供了任何回调或监听器来了解连接中断?

EG。与ActiveMQ一样http://activemq.apache.org/maven/apidocs/org/apache/activemq/transport/TransportListener.html

谢谢,
Anuj

3 个答案:

答案 0 :(得分:2)

就连接被丢弃而言,将通过异常监听器发送连接中断异常。

编写JMS规范,以便仅在同步调用时合法地返回诸如连接断开之类的事件。我还建议设置异常监听器,并从所有消息传递操作中捕获异常并采取适当的操作。

答案 1 :(得分:1)

是否要在队列管理器端或客户端应用程序中监视客户端应用程序连接?

要获得有关任何连接问题的通知,MQ JMS客户端的ExceptionListener可以附加到MQConnection。当连接到队列管理器时出现问题时,将调用此异常侦听器,例如,与队列管理器的连接中断。更多详细信息here:查看setExceptionListener方法的详细信息。调用MQConnection上的setExceptionListener方法来注册回调,如下所示。

  MQQueueConnectionFactory cf = new MQQueueConnectionFactory();
  ExceptionListener exceptionListener = new ExceptionListener(){
                @Override
                public void onException(JMSException e) {
                    System.out.println(e);
                    if(e.getLinkedException() != null)
                        System.out.println(e.getLinkedException());
                }
            };
 MQQueueConnection connection = (MQQueueConnection) cf.createQueueConnection();
 connection.setExceptionListener(exceptionListener);

答案 2 :(得分:0)

要主动检查连接和会话的健康状况,我正在考虑使用以下方法。

/**
 * Method to check if connection is healthy or not.
 * It creates a session and close it. mqQueueConnection
 * is the connection for which we want to check the health. 
 */
protected boolean isConnectionHealthy()
{
    try {
        Session session = mqQueueConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        session.close();
    }
    catch(JMSException e) {
        LOG.warn("Exception occured while checking health of connection. Not able to create " + "new session" + e.getMessage(), e);
        return false;
    }
    return true;
}

/**
 * Method to check if session is healthy or not.
 * It creates a consumer and close it. mqQueueSession
 * is the session for which we want to check the health.
 */
protected boolean isSessionHealthy()
{
    try {
        MessageConsumer consumer = mqQueueSession.createConsumer(mqQueue);
        consumer.close();
    }
    catch(JMSException e) {
        LOG.warn("Exception occured while checking health of the session. Not able to create "
            + "new consumer" + e.getMessage(), e);
        return false;
    }
    return true;
}

它接近看起来好吗?

我在这里只有一个恐惧: 我正在isConnectionhealthy()方法中创建一个测试会话并关闭它。它是否会影响实际用于实际通信的已创建会话?我的意思是它会做什么类似关闭已经创建的会话并开始新的一个?