Java Websphere MQ使用JMS,关闭的连接卡在MQ上

Java Websphere MQ使用JMS,关闭的连接卡在MQ上,java,jms,websphere,message-queue,ibm-mq,Java,Jms,Websphere,Message Queue,Ibm Mq,我在AIX服务器下的OC4J上部署了一个简单的JMS应用程序,在我的应用程序中,我正在侦听一些队列并发送到部署在AS400服务器下的Websphere MQ上的其他队列 问题是,当这些队列保持空闲一段时间时,我与这些队列的连接被终止/关闭,出现错误mqjms016(这不是问题),但当这种情况发生时,我尝试恢复连接并使其工作,旧连接卡在MQ上,在手动终止之前不会终止 恢复代码如下所示: public void recover() { cleanup(); init(); } pu

我在AIX服务器下的OC4J上部署了一个简单的JMS应用程序,在我的应用程序中,我正在侦听一些队列并发送到部署在AS400服务器下的Websphere MQ上的其他队列

问题是,当这些队列保持空闲一段时间时,我与这些队列的连接被终止/关闭,出现错误
mqjms016
(这不是问题),但当这种情况发生时,我尝试恢复连接并使其工作,旧连接卡在MQ上,在手动终止之前不会终止

恢复代码如下所示:

public void recover() {
    cleanup();
    init();
}

public void cleanup(){
    if (session != null) {
        try {
            session .close();
        } catch (JMSException e) {
        }
    }
    if (connection != null) {
        try {
            connection.close();
        } catch (JMSException e) {
        }
    }
}

public void init(){
    // typical initialization of the connection, session and queue...
}

由于孤立连接(MQ端的卡滞连接)不影响消息处理(即,它们不使用消息),因此我们保持原样,直到达到MQ上允许的最大连接数

恢复不再起作用,一旦我们达到这一点,MQ管理员必须手动清理孤立连接,但是,好消息是,搜索此特定问题导致IBM支持站点上报告了一个问题:


MQJMS1016是一个内部错误,表示连接丢失是由于代码或WMQ本身出现错误造成的。调整频道会有所帮助,但你确实需要解决一个问题:为什么应用程序的孤立连接速度快到足以耗尽所有可用频道

我想做的第一件事是检查正在运行的WMQ和WMQ客户端的版本。如果这是一项新的开发,请确保您使用的是WMQ v7客户端,因为v6从2011年9月起已经停止使用。v7客户机与v6 QMgrs一起工作,直到您能够升级它为止。一旦进入v7客户机和QMgr,就有很多通道调优和重新连接选项可供选择

WMQ v7客户端下载如下:

另外,请注意,上面代码中的重新连接逻辑在尝试之间不会休眠。如果客户端以高速率抛出连接请求,它会使WMQ侦听器过载,并执行非常有效的DOS攻击。建议在两次尝试之间睡眠几秒钟

最后,请在JMSException捕获块中打印链接的异常。如果JMS传输提供程序有问题,JMS链接异常将包含任何低级错误信息。在WMQ的情况下,它包含原因码,例如2035 MQRC_授权_错误或2033 MQRC_NO_MSG_可用。下面是一个例子:

try {
  .
  . code that might throw a JMSException
  .
} catch (JMSException je) {
  System.err.println("caught "+je);
  Exception e = je.getLinkedException();
  if (e != null) {
    System.err.println("linked exception: "+e);
  } else {
    System.err.println("No linked exception found.");
  }
}

如果您在某个晚上凌晨2点出现错误,您的WMQ管理员将感谢您链接的异常。

但是在session.close()中有什么问题,它在哪里“卡住了”?问题是,在Websphere MQ端,旧的侦听器/生产者被卡住了,因此我将有额外的作业连接到MQ。恢复代码运行时没有问题。APAR引用的只是告诉您如何调整通道,以便WMQ更快地恢复孤儿。虽然这是有帮助的,但它仍然只是一种解决方法,不能替代修复根本原因和打印链接异常。网络配置为终止任何空闲连接,因此问题对我们来说很清楚,链接异常有点无关(不过,我会检查问题的历史记录,并在我有更多时间时提供链接的异常)。连接恢复实际上是在30秒超时的情况下进行的,并且达到最大连接数问题需要几天才能发生(不像我原来的帖子所建议的那样频繁)最终,我们必须通过我们启动的每个连接发送保持活动状态的消息。这是个好消息!值得一提的是,链接异常并不是WMQ特有的。任何传输提供商都可以选择将相关信息放在其中。因此,如果它成为编码标准,它将有助于任何JMS代码。我有许多客户赢得了这一消息“我不接受没有它的代码进入生产环境。不管怎样,很高兴听到keepalives现在正在维护连接。”。