try
{
MQManager = new MQQueueManager(QueueManager);
try
{
MQRequestQueue = MQManager.AccessQueue(QueueName, MQC.MQOO_INPUT_AS_Q_DEF + 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;
我使用上面的c#代码使用WebsphereMQ提供的MQseries dll连接到MQ。当QueueManager关闭时,它需要20-30秒,直到我得到异常,我可以看到所有内容都已停止在此代码中。
是MQ客户端 - 服务器通信的预期行为吗? 如果没有,我如何检测queuemanager是否已关闭以便我可以命中下一个可用的queuemanager? 是否有超时属性?
答案 0 :(得分:2)
如果您正在运行客户端 - 服务器通信,那么就会涉及到网络。队列管理器不可用时应用程序的检测时间取决于应用程序当时正在执行的操作以及队列管理器的结束方式。
如果队列管理器已停顿,并且应用程序当时正在使用队列管理器连接,那么您应立即获得通知。类似地,如果你有一个连接异常处理程序,那么即使你的应用程序当时没有使用队列管理器连接,异常处理程序也会像它一样计算,你应该立即获得通知。您提供的代码片段表明,当队列管理器被关闭时,您可能暗示您处于等待状态?
如果队列管理器比静默更严重,那么你可能不得不依赖网络超时来检测队列管理器不再位于套接字的另一端,这就是你的延迟
您能否在问题中指出队列管理器是如何结束的,以及您是否有一个异常处理程序,或者您的应用程序是否在队列管理器关闭时实际使用了该连接。
您是否也可以使用IBM MQ版本和SVRCONN频道的详细信息更新您的问题,特别是SHARECNV和HBINT。
答案 1 :(得分:1)
由于您尚未提供完整的代码,因此您的代码中不清楚您使用的是什么类型的连接,绑定或客户端。您的应用程序是否连接到在同一台计算机(与您的应用程序)或另一台计算机上运行的队列管理器。您是否在代码中初始化了MQEnvironment类?
如果它是绑定连接,即您的应用程序使用共享内存连接到在同一台机器上运行的队列管理器,则应立即抛出异常。
如果您的应用程序连接到在不同计算机上运行的队列管理器,则会出现网络延迟。主机名解析也可能需要时间。所以你需要检查你的网络。
我想我们需要有关您的应用程序的更多信息。基于此,我可以进一步提供帮助。
答案 2 :(得分:0)
MQ Client正在花时间了解MQ队列是否已关闭,因为TCP连接超时。 MQ客户端(如果安装在Windows服务器上)根据Windows操作系统的TCP超时设置等待一定的修复时间。
如果要处理MQclient的TCP超时,可以通过位于已安装的MQ位置的mqclient.ini进行,即C:/../ IBM / Webshperemq
http://www.ibm.com/support/knowledgecenter/SSFKSJ_7.5.0/com.ibm.mq.con.doc/q016840_.htm