【问题标题】:"The handle is invalid" execption recevied while creating the object of MQ Queue Manager创建 MQ 队列管理器对象时收到“句柄无效”异常
【发布时间】:2018-07-08 19:25:06
【问题描述】:

请找到以下代码:

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.GetModuleInfos(Int32 processId, Boolean firstModuleOnly) 在 System.Diagnostics.Process.get_Modules() 在 IBM.WMQ.CommonServices.TraceEnvironment() 在 IBM.WMQ.CommonServices.CreateCommonServices() 在 IBM.WMQ .CommonServices.TraceEnabled() 在 IBM.WMQ.MQBase..ctor() 在 IBM.WMQ.MQManagedObject..ctor()

【问题讨论】:

  • 你能发布确切的异常堆栈吗?您的应用程序是否会在每次放置/获取消息时打开与队列管理器的连接?您是否通过在队列管理器对象上调用 close 方法和断开连接方法来关闭已打开的队列?
  • 是的,每次获取/放置消息时都会打开连接。是的,每次完成获取/放置后,我都会关闭队列和队列管理器。所以代码是这样写的 1. 打开队列管理器 2. 访问队列 3. 获取/放置消息到队列 4.disconnect 并关闭 QM 5.disconnect 队列
  • 我没有确切的异常堆栈
  • @Shashi,查看配置文件,您似乎对如何使用 .NET 可用的 MQseries 组件有了更多的想法。正如 Roger 下面提到的 MQEnvironment 类不是线程安全的,不是吗??
  • MQEnvironment 类有一个静态构造函数。因此,每个应用程序只初始化一次。应用程序中的所有线程都将使用 MQEnvironment 类的唯一且唯一的一个实例。需要更多诊断信息来了解“句柄无效”错误的含义。

标签: c# ibm-mq


【解决方案1】:

感谢您提供调用堆栈。您提到的问题与 MQ 版本 7.5.0.2 中修复的here 非常相似。由于您使用的是 MQ v7.5.0.0,我建议您将 MQ 客户端升级到最新级别 MQ v7.5.0.7 并尝试。

【讨论】:

  • 看来你的答案更接近我发现的问题。如果我发现任何日志,我会用新日志更新你
【解决方案2】:

我在这里已经说过很多次了,它适用于 Java 和 .NET,MQEnvironment 类不是线程安全的。使用它,你是在自取其辱。

将值(通道、主机名和端口号)放入 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);

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

【讨论】:

  • 嗨罗杰,感谢您的回复。但是,我没有传递任何参数而不是 QM 名称。如果 MQEnvironment 变量可以像您一样作为参数在 QM 中传递,我感到很惊讶(我是 MQseries 的新手)此外,我已将这个特定代码放在托管在我的 IIS 服务器上的服务中,以便所有人都可以使用。我怎样才能保持连接。我认为使用后连接/断开连接很好。
  • ,你的意思是说我写代码的方式很糟糕?你可以找到我在上面对Shashi的评论中写的步骤
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
  • 2014-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多