我在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...
}
答案 0 :(得分:3)
MQJMS1016是内部错误,表示连接丢失是由于代码或WMQ本身的错误造成的。调整频道将有所帮助,但你真的需要解决为什么应用程序快速喷出孤立连接以消耗所有可用频道的问题。
我要做的第一件事是检查正在运行的WMQ和WMQ客户端的版本。如果这是新开发,请确保您使用的是WMQ v7客户端,因为v6是截至2011年9月的生命周期结束.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管理员会感谢您提供链接的例外情况。
答案 1 :(得分:1)
由于孤立连接(MQ端的卡住连接)不会影响消息处理(即它们不消耗消息),因此我们将事物保留原样,直到达到MQ上允许的最大连接为止。
恢复不再起作用,一旦我们达到这一点,MQ管理员必须手动清理孤立连接,但是,好消息是搜索此特定问题导致IBM支持站点报告了一个问题: