一段时间后我无法重新连接到 MQQueueManager 作为异常(原因代码2059- 当我构造 MQQueueManager 的新对象时,抛出 MQRC_Q_MGR_NOT_AVAILABLE)。我的客户端应用程序是用 .NET/C# 编写的,我在 Win2003 上运行它。
不过,在重新启动客户端应用程序后,我可以连接到 QM。这是否表明 QM 库中的某些状态不正确?如何重置代码中的状态以便重新连接到 QM?有没有办法从客户端应用程序代码重置/断开与 QM 的所有活动 TCP 连接?
我的连接代码:
Hashtable properties = new Hashtable();
properties.Add( MQC.HOST_NAME_PROPERTY, Host );
properties.Add( MQC.PORT_PROPERTY, Port );
properties.Add( MQC.USER_ID_PROPERTY, UserId );
properties.Add( MQC.PASSWORD_PROPERTY, Password );
properties.Add( MQC.CHANNEL_PROPERTY, ChannelName );
properties.Add( MQC.TRANSPORT_PROPERTY, TransportType );
// Following line throws an exception randomly
MQQueueManager queueManager = new MQQueueManager( qmName, properties );
堆栈跟踪:
Source: amqmdnet
CompletionCode: 2
ReasonCode: 2059
Reason: 2059
Stack Trace:
at IBM.WMQ.MQBase.throwNewMQException()
at IBM.WMQ.MQQueueManager.Connect(String queueManagerName)
at IBM.WMQ.MQQueueManager..ctor(String qmName, Hashtable properties)
at WebSphereMQOutboundAdapter.WebSphereMQOutbound.ConnectToWebSphereMQ()
连接是每个线程的,因此如果您尝试在先前的 QMgr 对象仍在实例化的情况下创建新连接,您将得到此信息。如果您在创建新对象之前关闭以前的连接并销毁该对象,那么应该没问题。由于队列和其他 WMQ 对象依赖于连接句柄,因此它们也需要被销毁,然后在建立新连接后重新实例化。
当然,对于这种行为还有一些其他的解释,但这些解释的可能性要小得多。例如,通道出口或(在 WMQ v7 中)配置可能会限制来自给定 IP 地址的同时连接数。当连接被切断而不是关闭时,在 QMgr 端保持连接的通道代理必须超时,然后 QMgr 才会发现连接已关闭。如果设置了连接限制,这些“幽灵”连接会减少可用池。但正如我所说,这比在尝试重新连接之前不清理旧对象的程序要少得多。
这也有可能是一个错误。为了减少这种可能性,并出于各种其他原因(例如 WMQ v6 将于明年终止),我建议在该项目中在客户端和服务器端使用 WMQ v7.0.1.2。一般来说,只要您坚持使用 v6 功能,您就可以将 v7.0.1.2 客户端与 v6.0.x 服务器一起使用。除此之外,.Net 代码更好地集成在 v7 中,并且 Cat-3 SupportPac 现在包含在基本安装介质中,而不是单独下载。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)