全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1255
推到 Plurk!
推到 Facebook!

三層架構內使用SimpleObjectBroker問題.

缺席
shchen
一般會員


發表:12
回覆:26
積分:7
註冊:2003-08-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-04-02 11:40:23 IP:116.6.xxx.xxx 訂閱
關於在三層架構內使用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, 註解 無‧
系統時間:2017-12-17 17:45:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!