2009-09-01 114 views
2

我有一个简单的JMS应用程序部署在AIX服务器上的OC4J中,在我的应用程序中我正在侦听某些队列并发送到部署在AS400服务器下的Websphere MQ上的其他队列。Websphere MQ使用JMS,闭合连接停留在MQ

的问题是,我对这些队列连接将终止/时,它保持空闲一段时间与错误MQJMS1016关闭(这是没有问题的),并且这种情况发生时,我尝试恢复连接,并将其工作,但是,旧的连接卡在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... 
} 
+0

但问题是什么,它在哪里“卡住” - 在session.close()? – nos 2009-09-01 19:43:15

+0

问题是,在Websphere MQ方面,旧的监听器/制作者被卡住了,所以我将会有额外的工作似乎连接到MQ。 恢复代码正常运行 – 2009-09-01 20:17:30

回答

1

由于孤立的连接(MQ上侧卡连接)不影响邮件处理(即它们不消耗的消息),我们离开的事情,因为它是直到达到MQ允许的最大连接数。

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

check here

+0

参考的APAR只是告诉您如何调整通道,以便WMQ更快地收回孤儿。虽然这很有帮助,但它仍然只是一种解决方法,无法替代修复根本原因和打印链接异常。 – 2010-08-25 17:19:40

3

的MQJMS1016是一个内部错误,表示连接损失是由于一些错误的代码或WMQ本身。调整频道将有所帮助,但您真的需要解决为什么应用程序正在喷出孤立连接速度足以耗尽所有可用频道的问题。

我想要做的第一件事是检查正在运行的WMQ和WMQ客户端的版本。如果这是新开发,请确保您使用的是WMQ v7客户端,因为截至2011年9月,v6已达到使用期限.v7客户端可以与v6 QMgrs配合使用,直到您可以升级为止。一旦你开始使用v7客户端和QMgr,就可以使用很多频道调谐和重新连接选项。

的WMQ V7客户端下载是在这里:http://bit.ly/bXM0q3

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

最后,请在您的JMSException catch块中打印链接的异常。如果您对JMS传输提供程序有问题,则JMS关联的异常将包含任何低级错误信息。对于WMQ,它包含原因代码,例如2035 MQRC_AUTHORIZATION_ERROR或2033 MQRC_NO_MSG_AVAILABLE。这里有一个例子:

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管理员会感谢你的链接例外。

+0

网络配置为终止任何空闲连接,所以问题很明显,链接的异常是无关紧要的(不过,我会检查问题的历史记录,并在有更多时间时提供链接的异常)。 实际上,连接恢复时间超过30秒,并且最大连接数已达到问题需要几天时间(不像我原来的文章所暗示的那样频繁) 最终,我们不得不发送保持连接消息通过我们发起的每个连接。 – 2010-08-27 20:40:20

+0

这是个好消息!对于它的价值,链接的异常事件不是WMQ特有的。任何运输公司都可以选择在那里放置相关信息。所以如果它成为一个编码标准,它将有助于任何JMS代码。我有许多客户如果没有它,就不接受代码。无论哪种方式,很高兴听到Keepalive现在保持联系。 – 2010-08-27 21:25:09