2010-04-18 54 views
1

我正在設計一個系統,我需要繼續嘗試連接到MQ服務器unitl我得到一個連接的過程。調用相同的函數,直到它連接到服務器

默認情況下,如果MQ不可用,它將會例外。如何一次又一次地調用相同的方法,直到我獲得連接。我知道我可以使用遞歸,有沒有更好的方法來做到這一點。因爲我想避免無限循環。我也想等待進一步的處理,直到我獲得連接。

我使用.net 2.0與C#。這是窗口服務應用程序。

+0

您能否提供迄今爲止所做的工作的例子?它有助於澄清問題。 – Abbas 2010-04-18 17:10:53

+0

如果你不想要一個無限循環,你想要什麼? – SLaks 2010-04-18 17:11:19

回答

1

已提供的代碼示例將爲您提供所需的循環,因此我不會重複該建議。不過,我有幾點建議。

WMQ v7.0中的.Net功能是很多比WMQ v6更好。在可用的選項中,客戶端重新連接可以完全在通道配置中處理。自從2011年9月發佈V6以來,這是一個新的應用程序,我強烈建議使用WMQ v7客戶端。您可以將其與v6 QMgr一起使用,但不會獲得所有v7功能。最好還可以使用v7 QMgr,然後將重新連接行爲作爲可配置選項。如果您現在使用v6,那麼如果您希望能夠從IBM獲得支持,則需要在未來的18個月內升級到v7。

IBM - MQC7:WebSphere MQ的V7.0客戶端http://bit.ly/bXM0q3

假設你將與編碼連接邏輯出發,你一定要睡至少一整秒,最好幾秒鐘,重新連接嘗試之間。如果不這樣做,WMQ監聽器就會氾濫,並執行非常有效的拒絕服務攻擊。

務必在日誌消息中包含WMQ原因代碼。例如,如果您試圖將消息放入隊列並取回2053 MQRC_Q_FULL,通常是由快速生產者/慢速消費者問題導致的暫時錯誤。但是如果你回到2035 MQRC_AUTHORIZATION_ERROR那麼沒有人工干預就沒有機會恢復程序。如果記錄的消息沒有WMQ原因代碼,則很難確定傳輸層中錯誤的根本原因。

+0

Thx幫助。 – user171523 2010-04-25 23:05:40

3

這裏的基本結構:

while(true) 
{ 
    try 
    { 
    // attempt connection 
    break; // Will only get here if an exception was not thrown 
    } 
    catch 
    { 
    // Logging, sleep statement 
    } 
} 

如果你有發現如果無法建立連接進行的任何方法(其他然後拋出一個異常),請使用。例外情況不應該用於流量控制,我已經展示的例子適用於極端情況。

爲避免循環無限,您可能需要添加計數(例如,只嘗試10次)。

+0

這就是你如何「可以」這樣做,是否應該允許無限通話是另一個問題。就我個人而言,我會在捕捉之後(至少1ms)進行某種睡眠來平息它的CPU使用率,並且可能有最大的失敗次數。很好的答案,但它符合他們想要的。 – 2010-04-18 17:13:08

+0

睡覺應該是一整秒或更多。如果客戶端重新連接循環速度太快,它將使用WMQ監聽程序積壓,此時從任何客戶端或對等QMgr的遠程連接都不會成功。 – 2010-04-23 13:57:43

3

我看到它的方式,循環應該是無限的。你想成爲那個必須重啓服務的人,因爲服務器已經關閉了45分鐘嗎?

const int attempts = 3; 
const int perAttemptSleep = 5000; 
const int perTrialSleep = 600000; 

while (true) 
{ 
    for (var i = 0; i < attempts; i++) 
    { 
     try 
     { 
      Connect(); 
      return; 
     } 
     catch (ConnectException) 
     { 
      Thread.Sleep(perAttemptSleep); 
     } 
    } 

    Log(); 
    Thread.Sleep(perTrialSleep); 
} 
+0

@Oded nope:它會等待'perTrialSleep'定義的時間,然後重新輸入'for'塊,重置'i'並嘗試3次。 – 2010-04-18 18:22:05