句柄无效"在创建MQ队列管理器的对象时收到的异常
本文关键字:对象 管理器 异常 队列 MQ 无效 quot 创建 句柄 | 更新日期: 2023-09-27 18:14:40
请查看以下代码:
MQEnvironment.Hostname = HostName;
MQEnvironment.Channel = Channel;
if (!string.IsNullOrEmpty(SSLKeyRepository))
{
MQEnvironment.SSLCipherSpec = SSLCipherSpec;
MQEnvironment.SSLKeyRepository = SSLKeyRepository;
}
if (Port > 0)
MQEnvironment.Port = Port;
try
{
MQManager = new MQQueueManager(QueueManager);
try
{
MQRequestQueue = MQManager.AccessQueue(QueueNameGet, MQC.MQOO_INPUT_AS_Q_DEF + MQC.MQOO_FAIL_IF_QUIESCING);
MQResponseQueue = MQManager.AccessQueue(QueueNameGet, MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING);
return true;
}
catch (IBM.WMQ.MQException exIBM)
{
CloseConnection();
ErrorCode = exIBM.Reason;
ErrorDescription = exIBM.Message;
}
}
catch (IBM.WMQ.MQException exIBM)
{
CloseConnection();
ErrorCode = exIBM.Reason;
ErrorDescription = exIBM.Message;
}
catch (Exception ex)
{
CloseConnection();
ErrorCode = Constants.SYSTEMEXCEPTION;
ErrorDescription = ex.Message;
}
return false;
问题:当我运行它一次或2-3次时,我没有得到这个问题。但是当它在循环中多次运行时,我就会遇到问题。此外,我已经尝试在IIS服务器上运行同一段代码10,000次,并且它成功运行了。
只有当我在IIS web服务上有这个代码并且该web服务被多次调用时,我才会遇到这个问题。
IIS服务器上安装了IBM MQ客户机7.5.0.0,我使用的是相同版本的dll。
错误描述:
错误信息句柄无效
StackTrace在System.Diagnostics.NtProcessManager。getmoduleinfo (Int32 processId, Boolean firstModuleOnly) at System.Diagnostics.Process.get_Modules() at IBM.WMQ.CommonServices.TraceEnvironment() at IBM.WMQ.CommonServices.CreateCommonServices() at IBM.WMQ.CommonServices.TraceEnabled() at IBM.WMQ.MQBase..ctor() at IBM.WMQ.MQManagedObject. ctor()
感谢提供调用堆栈。您提到的问题与MQ版本7.5.0.2中修复的问题非常相似。由于您使用的是MQ v7.5.0.0,我建议您将MQ客户机升级到最新的MQ v7.5.0.7,并尝试。
我在这里已经说过很多次了,它适用于Java和。net, MQEnvironment类不是线程安全的。使用它,你就是搬起石头砸自己的脚。
输入值(channel, hostname &端口#)生成HashTable,并将HashTable传递给MQQueueManager类。
Hashtable qMgrHT = new Hashtable();
qMgrHT.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED);
qMgrHT.Add(MQC.HOST_NAME_PROPERTY, "10.10.10.10");
qMgrHT.Add(MQC.CHANNEL_PROPERTY, "TEST.CHL");
qMgrHT.Add(MQC.PORT_PROPERTY, 1414);
qMgrHT.Add(MQC.USER_ID_PROPERTY, "myUserID");
qMgrHT.Add(MQC.PASSWORD_PROPERTY, "myPwd");
MQQueueManager qMgr = new MQQueueManager(qManager, qMgrHT);
最后,编写代码使其保持连接,而不是不断地连接和断开连接。非常非常糟糕。