2016-10-25 30 views
0

請找到下面的代碼:「句柄無效」 execption recevied同時創造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 Web服務和Web服務被調用多次。

IBM MQ客戶端7.5.0.0安裝在IIS服務器上,我使用的是相同版本的dll。

UPDATE 錯誤說明:

錯誤消息中的句柄無效
堆棧跟蹤在System.Diagnostics.NtProcessManager.GetModuleInfos(的Int32的ProcessID,布爾firstModuleOnly)在System.Diagnostics.Process.get_Modules()在IBM.WMQ.CommonServices.CreateCommonServices()上的IBM.WMQ.CommonServices.TraceEnvironment()IBM上的IBM.WMQ.CommonServices.TraceEnabled()IBM上的IBMWMQ.MQBase..ctor().WMQ.MQManagedObject..ctor )

+1

你能發佈確切的異常堆棧嗎?每次發送/獲取消息時,應用程序是否會打開與隊列管理器的連接?您是否通過調用隊列管理器對象的disconnect方法來調用close方法和連接來關閉已打開的隊列? – Shashi

+0

是的,它在每次獲取/放置消息時都會打開連接。是的,每次完成get/put後關閉隊列和隊列管理器。因此,代碼是這樣寫的 1.打開隊列管理器 2.訪問隊列 3. GET /把消息隊列上 4.disconnect並關閉QM 5.disconnect隊列 –

+0

我沒有確切的異常堆棧 –

回答

0

我在這裏多次說過,它適用於Java和.NE T,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); 

最後,編寫您的代碼,以便它保持連接而不是連接和斷開連接。非常非常糟糕的形式。

+0

嘿羅傑,謝謝你的回覆。但是,我沒有傳遞任何參數而不是QM名稱。 我只是感到驚訝,如果MQEnvironment變量可以在QM中作爲參數傳遞像你一樣(我是MQseries的新手) 另外,這個特殊的代碼放在服務器上,這個代碼寄存在我的IIS服務器上,提供給所有人。我如何維護連接。我認爲它使用後很好連接/斷開連接。 –

+0

,你的意思是說我寫代碼的方式非常糟糕嗎? 你可以找到我在上面的評論中寫到的步驟,以便Shashi –

+0

我已更新錯誤描述。 –

1

感謝您提供調用堆棧。你提到的問題非常類似於MQ版本7.5.0.2中修復的here。由於您位於MQ v7.5.0.0,我建議您將MQ客戶端升級到最新級別MQ v7.5.0.7並嘗試。

+0

看來你的答案更接近我發現的問題。如果我找到任何東西,會用新日誌更新你 –

相關問題