"句柄无效"创建MQ队列管理器

时间:2016-10-25 06:18:00

标签: c# ibm-mq

请找到以下代码:

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 webservice上有这个代码并且多次调用webservice时才会遇到问题。

在IIS服务器上安装IBM MQ客户端7.5.0.0,我正在使用相同版本的dll。

更新 错误说明:

错误消息句柄无效
    位于IBM.WMQ的IBM.WMQ.CommonServices.CreateCommonServices()的IBM.WMQ.CommonServices.TraceEnvironment()处的System.Diagnostics.NtProcessManager.GetModuleInfos(Int32 processId,Boolean firstModuleOnly)中的StackTrace,位于System.Diagnostics.Process.get_Modules()处。位于IBM.WMQ.MQManagedObject..ctor()的IBM.WMQ.MQBase..ctor()上的.CommonServices.TraceEnabled()

2 个答案:

答案 0 :(得分:1)

感谢您提供调用堆栈。您提到的问题与MQ V7.5.0.2中的固定here非常相似。当您在MQ v7.5.0.0时,我建议您将MQ客户端升级到最新级别MQ v7.5.0.7并尝试。

答案 1 :(得分:0)

我在这里已多次说过它并且它适用于Java和.NET,MQEnvironment类不是线程安全的。通过使用它,你就是在脚下拍摄自己。

将值(channel,hostname& port#)放入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);

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