MIDAS開發中使用SimpleObjectBroker实现容错出現的問題(300分)

  • 主题发起人 主题发起人 qinmingzsj
  • 开始时间 开始时间
Q

qinmingzsj

Unregistered / Unconfirmed
GUEST, unregistred user!
[blue]使用SimpleObjectBroker实现容错却出现如下问题:
我有两个APPSERVER,当客户端程序在使用的过程中,我停止了客户端连接的APPSERVER,为了保证客户端程序可以不中断的使用,因此使用下面的程序去连接另外一个APPSERVER
第一段代码的Tclientdataset.Open 没有作用,但是使用第2段代码却又可以,哪位高手可以告诉我原因及更好的解决办法吗:
第一段代码:
procedure TForm1.Button1Click(Sender: TObject);
begin

with ClientDataSet1do
begin
try
close;
Params.ParamByName('CKEY_NO').Value := '0000156000';
open;
except
if Set_SocketCN(SocketConnection1) then

Button1Click(self);
end;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin

with ClientDataSet1do
begin
try
close;
Params.ParamByName('CKEY_NO').Value := '0000236000';
open;
except
if Set_SocketCN(SocketConnection1) then

begin

EmptyDataSet;
FetchParams;
Params.ParamByName('CKEY_NO').Value := '';
open;
Button1Click(self);
end;
end;
end;
end;

Function Set_SocketCN( Socket: Array Of TSocketConnection): boolean;
Var
Icount: integer;
VHost: String;
begin
If length(Socket) <= 0 then
exit;
Try
For Icount := low(Socket) To high(Socket)do
begin
Socket[Icount].Connected := false;
Socket[Icount].Connected := true;
end;
Except
Try
For Icount := low(Socket) To high(Socket)do
begin
Socket[Icount].Connected := false;
Socket[Icount].ObjectBroker.SetConnectStatus(Socket[Icount].Host, False);
end;
Finally
Try
For Icount := low(Socket) To high(Socket)do
begin
VHost := Socket[Icount].ObjectBroker.GetComputerForProgID
('Project1.Test_Server');
Socket[Icount].Host := VHost;
Socket[Icount].Connected := True;
end;
Except
On EBrokerExceptiondo
begin
Showmessage('沒有服務器可以使用,請稍后再使用系統');
end;
end;
end;
end;
end;
[/blue]
 
第二段代码在哪里?
你第一段代码中Button1Click过程中出现异常并满足条件时则调用自身Button1Click, 形成递归调用
 
htw:
第二段代码在哪里?
第二段代码就是下面
procedure TForm1.Button2Click(Sender: TObject);
begin

with ClientDataSet1do
begin
try
close;
Params.ParamByName('CKEY_NO').Value := '0000236000';
open;
except
if Set_SocketCN(SocketConnection1) then

begin

EmptyDataSet;
FetchParams;
Params.ParamByName('CKEY_NO').Value := '';
open;
Button1Click(self);
end;
end;
end;
end;

Button1Click过程中出现异常并满足条件时则调用自身Button1Click, 形成递归调用
我就是需要递归调用才可以的呀,关键是递归调用后,第一个按钮却无法完成需要的工作,但是第二个按钮虽然会出现异常提示,但是可以实现我的需求.
也许是我在使用SimpleObjectBroker时有什么偏差,不知道在三层中当客户端程序在使用的过程中,停止了客户端正在连接的APPSERVER后,为了保证客户端程序可以不中断的使用,再连接另外一个APPSERVER,你是怎样实现的,是否能赐教!盼复
 
容错处理是保证一个APP SERVER出问题后可切换到另一个APP SERVER
你的第一段代码达不到这个目标, 同一个APPSERVER出问题后, 在可能出现的情况中就有同一个APPSERVER一直有问题这一种情况, 而递归调用的结果可想而知
 
function connetc (connectionobject:Tcustomconnection):boolean;
begin
with connectionobjectdo
try
try
connected:=false;
except
end;
connected:=true;
result:=true;
except
result:=false;
end;
end;
功能:使用连接控件连接到可用的应用服务器
参数:connectionobject,任何Tcustomconnection 的后代
返回值:true表示连接成功,false表示不成功或没有可用的应用服务器
 
TO: htw
在Set_SocketCN(SocketConnection1)函數中我使用
Socket[Icount].ObjectBroker.SetConnectStatus(Socket[Icount].Host, False);將不能連接的APPSERVER已經設置成不可以使用,然后使用
VHost := Socket[Icount].ObjectBroker.GetComputerForProgID
('Project1.Test_Server');再去尋找另外一個APPSERVER,
所以你說第一段代码达不到这个目标, 同一个APPSERVER出问题后, 在可能出现的情况中就有同一个APPSERVER一直有问题这一种情况, 而递归调用的结果可想而知 我不是很明白.
能否告訴你是怎樣使用SimpleObjectBroker实现容错的
TO: sunsam
我想你應該是只使用一台APPSERVER才這樣去連接的,你是否有過多台
APPSERVER的做法? 尤其是使用SimpleObjectBroker实现多台APPSERVER容错的方法?
盼復
 
这个函数就是用来处理多个Appserver的。不是我的主意,是从N年前的一本<多层分布式数据库实战>上学来的,刚开始我也以为是只能针对一台机,用了之后才发现它的妙处所在。
 
TO: sunsam
謝謝你的回答.但是我還是有點不明白,你是否可以將這個函數用一個實際例子體現出來
讓我更好的測試和理解,不甚感激!
 
真的很難過,在大富翁上問了的問題,卻無法得到一個滿意的結果!
其實,在這樣一個專業的論壇,斑竹為什么不可以組織一些高手去突破很多技朮難題呢?
或者如果這樣的問題太簡單,其實也應該告訴他怎樣去提高在以后不再提出這樣簡單的問題我想,只有這樣,大富翁才可以更富有技朮含量,才可以吸引更多的愛好者,更多的跟隨者,你們說呢?
有時候,或許天不隨人愿意,所以越來越失望!!
 
FetchParams;这条语句,在第一段里加上
procedure TForm1.Button1Click(Sender: TObject);
begin

with ClientDataSet1do
begin
try
close;
Params.ParamByName('CKEY_NO').Value := '0000156000';
open;
except
if Set_SocketCN(SocketConnection1) then

begin
Close;
FetchParams;
Button1Click(self);
end;
end;
end;
end;
是不是就OK了?
 
接受答案了.
 
后退
顶部