2016-11-13 67 views
1
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客戶端需要花費很多時間才能瞭解MQ隊列管理器已關閉

是否預期MQ客戶端 - 服務器通信的行爲? 如果不是,我如何檢測隊列管理器是否關閉以便我可以擊中下一個可用的隊列管理器? 是否有任何超時屬性?

回答

1

由於您尚未提供完整的代碼,因此您的代碼不清楚您正在使用哪種類型的連接,綁定或客戶端。您的應用程序是否連接到在同一臺計算機上運行的隊列管理器(作爲您的應用程序)或不同的機器。你是否已經在代碼中初始化了MQEnvironment類?

如果它是綁定連接,即您的應用程序使用共享內存連接到在同一臺機器上運行的隊列管理器,則應立即拋出異常。

如果您的應用程序連接到在另一臺計算機上運行的隊列管理器,則會出現網絡延遲。主機名解析也可能需要時間。所以你需要檢查你的網絡。

我想我們需要更多關於您的應用程序的信息。基於此,我可能會進一步提供幫助。

+0

是啊我已經初始化的環境變量。 Queuemanger位於不同的服務器上,並且隊列管理器已關閉,因爲服務器因部署/安裝了哪個隊列管理器而關閉。 –

+0

請參閱下面的Morag寶貴意見。 – Shashi

+0

我檢查了她的意見。大多數情況下,這似乎是網絡超時問題。但不知道,我如何能夠識別? –

2

當您運行客戶機 - 服務器通信時,如果您聲明自己正在運行,則會涉及到網絡。當隊列管理器不可用時,應用程序的檢測時間取決於應用程序當時正在執行的操作以及隊列管理器如何結束。

如果隊列管理器處於停頓狀態,並且應用程序當時正在使用隊列管理器連接,則應該立即收到通知。同樣,如果您有一個連接異常處理程序,那麼即使您的應用程序當時沒有使用隊列管理器連接,異常處理程序也會如此計算,您應該立即收到通知。您提供的代碼片段表明,也許您暗示您在隊列管理器被關閉時處於等待狀態?

如果隊列管理器是不是停頓放倒更嚴厲,那麼你可能不得不依賴於網絡超時檢測隊列管理器不再在插座的另一端,這是你的延遲會看到。

您能否在您的問題中指出隊列管理器是如何結束的,以及您是否有異常處理程序,或者您的應用程序是否在隊列管理器關閉時實際使用連接。

您是否還可以使用IBM MQ版本和SVRCONN通道的詳細信息更新您的問題,特別是SHARECNV和HBINT。

+0

MQ版本7.5.0.0 我僅僅通過成爲MQ的消費者(由其他供應商處理的MQ服務器服務)獲得了很多細節。 隊列管理器通過關閉隊列管理器所在的服務器而關閉。 –

+0

以這種方式結束隊列管理器是否是正常做法還是這是一種特殊情況?您可以調整您的MQ通道以更快地檢測到損壞的套接字,但是會犧牲一般運行的代價。如果這是正常的關閉隊列管理器,你能不能說服供應商以更優雅的方式關閉它? –

相關問題