使用JMS的WebSphere MQ,粘在MQ关闭的连接
-
20-09-2019 - |
题
我在AIX服务器部署在OC4J一个简单的JMS应用程序,在我的应用我在听一些队列,并发送到下AS400服务器上部署一个WebSphere 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...
}
解决方案 2
由于孤立的连接(在MQ侧卡住连接)不影响消息处理(即,它们不消耗消息),我们留下的东西,因为它是直到允许的MQ最大连接数达到。
在恢复没有工作了,一旦我们达到这一点,在MQ管理员必须手动清理孤立连接,然而,好消息是,寻找这方面的问题导致了报道IBM支持网站的一个问题:
其他提示
在MQJMS1016是一个内部错误和表示连接损失是由于一些错误代码或WMQ本身。调整渠道将帮助,但你真的需要去的问题,为什么应用程序被喷涌孤立足够快,以耗尽所有可用通道的连接。
我想要做的第一件事是检查WMQ的和正在运行的WMQ客户端的版本。如果这是新开发的,请确保您使用的是WMQ V7客户端,因为V6是2011年九月的结束生命的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管理员会感谢你的链接例外。