簡體   English   中英

TIBCO EMS故障轉移重新連接C#(TIBCO.EMS.dll)

[英]TIBCO EMS Failover reconnect for C# (TIBCO.EMS.dll)

我們有一個TIBCO EMS解決方案,它在2-4服務器環境中使用內置服務器故障轉移。 如果TIBCO管理員將故障轉移服務從一個EMS服務器轉移到另一個EMS服務器,則應該在EMS服務級別自動將連接轉移到新服務器。 對於使用EMS服務的C#應用​​程序,這種情況不會發生 - 我們的用戶連接在故障轉移后沒有轉移到新服務器,我們不確定原因。

我們的應用程序僅在啟動時連接到EMS,因此如果TIBCO管理員在用戶啟動應用程序后進行故障轉移,則用戶需要重新啟動應用程序以重新連接到新服務器(我們的EMS連接使用包含所有4個生產EMS服務器的服務器字符串 - 如果第一次嘗試失敗,它將移動到字符串中的下一個服務器並再次嘗試)。

我正在尋找一種自動化方法,如果檢測到連接已經死亡,我會定期嘗試重新連接到EMS,但我不確定如何最好地做到這一點。

有任何想法嗎? 我們正在使用TIBCO.EMS.dll版本4.4.2和.Net 2.x(SmartClient應用程序)

任何幫助,將不勝感激。

首先,是的,我正在回答我自己的問題。 然而,重要的是要注意,如果沒有ajmastrean,我將無處可去。 非常感謝!

ONE:ConnectionFactory.SetReconnAttemptCount,SetReconnAttemptDelay,SetReconnAttemptTimeout應該適當設置。 我認為默認值重復得太快(重試之間的1/2秒)。 由於網絡存儲等原因,我們的EMS服務器可能需要很長時間才能進行故障轉移 - 所以每隔1/2個間隔進行5次重試遠遠不夠。

TWO:我認為啟用客戶端 - 服務器和服務器 - 客戶端心跳非常重要。 無法驗證但是如果沒有這些,客戶端可能無法獲得服務器脫機或切換到故障轉移模式的通知。 當然,這是EMS的服務器端設置。

三:您可以通過設置Tibems.SetExceptionOnFTSwitch(true)來監視故障轉移事件; 然后連接異常事件處理程序。 在單服務器環境中,您將看到“已終止連接”消息。 但是,如果您處於容錯多服務器環境中,您將看到:“連接已執行容錯切換到”。 您並不嚴格需要此通知,但它可能很有用(特別是在測試中)。

四:顯然在EMS文檔中不清楚,連接重新連接在單服務器環境中不起作用。 您需要處於多服務器,容錯環境中。 然而,有一個技巧。 您可以將相同的服務器放在連接列表中兩次 - 我知道這很奇怪,但是它可以工作並且它使內置的重新連接邏輯能夠工作。

一些代碼:

private void initEMS()
{
    Tibems.SetExceptionOnFTSwitch(true);
    _ConnectionFactory = new TIBCO.EMS.TopicConnectionFactory(<server>);
    _ConnectionFactory.SetReconnAttemptCount(30);       // 30retries
    _ConnectionFactory.SetReconnAttemptDelay(120000);   // 2minutes
    _ConnectionFactory.SetReconnAttemptTimeout(2000);   // 2seconds
_Connection = _ConnectionFactory.CreateTopicConnectionM(<username>, <password>);
    _Connection.ExceptionHandler += new EMSExceptionHandler(_Connection_ExceptionHandler);
}
private void _Connection_ExceptionHandler(object sender, EMSExceptionEventArgs args)
{
    EMSException e = args.Exception;
    // args.Exception = "Connection has been terminated" -- single server failure
    // args.Exception = "Connection has performed fault-tolerant switch to <server url>" -- fault-tolerant multi-server
    MessageBox.Show(e.ToString());
}

這篇文章應該總結我目前的評論並更詳細地解釋我的方法......

TIBCO的“ConnectionFactory”和“Connection”類型是重量級的,線程安全的類型。 TIBCO建議您保持使用一個 ConnectionFactory(每個服務器配置的工廠)和每個工廠一個 Connection。

服務器似乎還負責就地“連接”故障轉移和重新連接,所以讓我們確認它正在完成其工作,然后依靠該功能。

與修復服務器或客戶端設置問題相比,創建客戶端解決方案會稍微復雜一些。 您需要重新創建從失敗的連接創建的所有會話(更不用說生產者,消費者和目的地)。 兩種類型都沒有“重新連接”或“刷新”方法。 會話也不保持對其父連接的引用。

您將不得不管理連接/會話對象的查找,並堅持重新初始化每個人! 或者實現某種會話失敗事件處理程序,它可以獲取新連接並重新連接它們。

因此,現在,讓我們深入了解客戶端是否設置為接收故障轉移通知(tib ems用戶指南第292頁)。 並確保捕獲引發的異常,包含故障轉移URL,並且正在正確處理。

客戶端應用程序可以通過設置tibco.tibjms.ft.switch.exception系統屬性來接收故障轉移通知

也許圖書館需要這個工作?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM