句柄无效"在创建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队列管理器的对象时收到的异常

感谢提供调用堆栈。您提到的问题与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);

最后,编写代码使其保持连接,而不是不断地连接和断开连接。非常非常糟糕。