【问题标题】:IBM MQ : Any way to get connection interruption notification?IBM MQ:有什么方法可以获取连接中断通知?
【发布时间】:2018-07-10 00:08:21
【问题描述】:

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

我想监控与管理器的 TCP 连接。如果我的客户端与经理的连接中断,我如何获得通知? IBM MQ API 中是否提供了任何回调或侦听器以了解任何连接中断?

例如。像 ActiveMQ 有http://activemq.apache.org/maven/apidocs/org/apache/activemq/transport/TransportListener.html

谢谢,
阿努杰

【问题讨论】:

    标签: java jms ibm-mq


    【解决方案1】:

    对于被丢弃的连接,将通过异常侦听器发送连接中断异常。

    JMS 规范的编写使得连接中断等事件仅在同步调用时合法返回。我还建议设置一个异常侦听器,并从所有消息传递操作中捕获异常并采取适当的措施。

    【讨论】:

      【解决方案2】:

      您想在队列管理器端还是在客户端应用程序中监视客户端应用程序连接?

      为了获得任何连接问题的通知,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);
      

      【讨论】:

      • 谢谢,很有帮助。还有一种方法可以检查我与 MQ 的连接是否正常且正常?例如。类似 connection.isConnected() 的东西?
      【解决方案3】:

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

      /**
       * 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() 方法中创建一个测试会话并关闭它。它不会影响实际用于实际通信的已创建会话吗?我的意思是它会做类似关闭已经创建的会话并开始新的会话吗?

      【讨论】:

      • 上述类型检查并不能保证在应用程序进行任何调用(如 Producer.send 或 Consumer.receive)时连接可用。因为当应用程序进行发送/接收调用时连接可能会中断。相反,我会选择自己调用 API 并处理抛出的任何异常。如果是连接断开异常,则重新连接或使用 MQ JMS 客户端本身提供的自动重新连接选项。
      • 有道理。但是我的客户端应用程序是一个异步侦听器,它使用 onMessage() 方法来接收消息。 mqConsumer.setMessageListener(obj);我如何在这里查看?
      • 另外,如果我在执行 producer.send 或 consumer.receive 时连接中断。我仍然可以检查,因为上面的代码将定期运行,并且当代码尝试在此创建会话时,isConnectionHealthy() 函数将返回 false。与 isSessionHealthy() 类似。
      • 如果连接断开,您的 MessageListener.onMessage 将不会被调用,而是会调用 ExceptionListener.onException。然后,您可以采取适当的措施,例如重新连接。如果在调用发送/接收时连接中断,调用将返回异常(对于 MQ,MQRC 2009)。您可以简单地捕获该异常并采取行动。在这种情况下,我认为不需要 isSessionHealthy!
      猜你喜欢
      • 2021-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      • 2020-01-30
      相关资源
      最近更新 更多