三層架構內使用SimpleObjectBroker問題. |
缺席
|
shchen
一般會員 發表:12 回覆:27 積分:7 註冊:2003-08-13 發送簡訊給我 |
關於在三層架構內使用SimpleObjectBroker,可以達成容錯功能,我知道如何在應用程式伺服器故障時,取得另一台應用程式伺服器,但大家總有個問題沒有解決,
就是當原本連線的伺服器故障後,使SetConnectStatus(ComputerName,false)將這台伺服器設為故障,讓SimpleObjectBroker不再選用這台伺服器後,當這台故障的應用程式伺服器恢復正常後,應用程式伺服器,要如何通知所有已連到別台SERVER的Client端程式內的SimpleObjectBroker,原本被SetConnectStatus(ComputerName,false)的標記,改成SetConnectStatus(ComputerName,true)? 查了網上眾多討論,得到由於SimpleObjectBroker沒有與SERVER端做任何溝通,只是依表內的HasFailed來選用代表正常的伺服器,SimpleObjectBroker無法知道其它伺服器正常了,這些功能要自己寫,所以我想了個方式,不知道對不對?在觸發了故障後,啟用了另一個Timer按時主動以另一個DCOMConnection2去測試被標示為HasFailed的伺服器,是否恢復了. 有沒有比我這方法更佳的做法呢? 我所使用另一個DCOMConnection去測試遠端是否恢復這做法正不正確呢? [code cpp] 以下程式碼是不斷取得SERVER的時間. try{ double old=DataModule4->ClientDataSet1->DataRequest(""); ServerTimes=old; Label2->Caption=ServerTimes; Label1->Caption=DataModule4->DCOMConnection1->ComputerName; } catch(Exception &E) { DataModule4->SimpleObjectBroker1->SetConnectStatus(DataModule4->DCOMConnection1->ComputerName,false); DataModule4->DCOMConnection1->Connected=false; DataModule4->DCOMConnection1->ComputerName=DataModule4->SimpleObjectBroker1->GetComputerForProgID("TestDCOMServerApp.TestDCOMServer"); try{ DataModule4->DCOMConnection1->Connected=true; ReCheckRemoteStatusTimer->Enabled=true; } catch(Exception &E) { ReCheckRemoteStatusTimer->Enabled=true; Timer1->Enabled=false; } } //--------------------------------------------------------------------------- //以下程式碼是在在觸發了故障後,啟用了另一個Timer按時主動以另一個DCOMConnection2去測試被標示為HasFailed的伺服器,是否恢復了 void __fastcall TForm3::ReCheckRemoteStatusTimerTimer(TObject *Sender) { bool WithFailed=false; for(int i=0;i < DataModule4->SimpleObjectBroker1->Servers->Count;i ) { if(DataModule4->SimpleObjectBroker1->Servers->Items[i]->HasFailed) { DataModule4->DCOMConnection2->ComputerName=DataModule4->SimpleObjectBroker1->Servers->Items[i]->ComputerName; try { DataModule4->DCOMConnection2->Connected=true; DataModule4->SimpleObjectBroker1->SetConnectStatus(DataModule4->DCOMConnection2->ComputerName,true); DataModule4->DCOMConnection2->Connected=false; ListBox1->Items->Add(DataModule4->SimpleObjectBroker1->Servers->Items[i]->ComputerName " 已經恢復"); Timer1->Enabled=true; } catch (Exception &E) { ListBox1->Items->Add(DataModule4->SimpleObjectBroker1->Servers->Items[i]->ComputerName " 尚未恢復 " E.ToString()); WithFailed=true; } } } if(!WithFailed) ReCheckRemoteStatusTimer->Enabled=false; } [/code] 編輯記錄
shchen 重新編輯於 2011-04-01 21:42:58, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |