【发布时间】: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 类的唯一且唯一的一个实例。需要更多诊断信息来了解“句柄无效”错误的含义。