首先要设SimpleObjectBroker的loadBalanced的属性为True,并保证所有的应用服器已向
SimpleObjectBroker注册,当客户端应用程序查觉原来的应用服器出现故障后立刻调用
TSimpleObjectBroker的SetConnectedStatus(False)通知TSimpleObjectBroker应用服务器
发生故障,然后调用GetComputerForProgID要求TSimpleObjectBroker查找另外一台提供相同
服务的应用程序服务器给客户端应用程序
只要把XXXConnection的ObjectBroker属性设为某个SimpleObjectBroker,
而那个SimpleObjectBroker的Servers列表属性里有一系列的服务器地址信息,连接时,用XXXConnection
的Open方法或设置它的Connected属性为True,组件就会自动尝试Servers列表中的所有服务器,
如果某个服务器不可用,则它的Enabled将被置为False;如果列表中所有的服务器的Enabled都是False,
则抛出"No Server Avalible"的异常。
要写的代码就是:
1、加入Servers列表项,以指写有哪些服务器可用
2、要重新连接,写代码把服务器列表中所有Enable属性置为True。
procedure TForm1.btnApplyUpdatesClick(Sender: TObject);
begin
try
ClientDataSet1.ApplyUpdates(0);
except
on Exception do
begin
try
DCOMConnection1.Connected := False;
SimpleObjectBroker1.SetConnectStatus
(DCOMConnection1.ComputerName, False);
finally
try
DCOMConnection1.ComputerName := SimpleObjectBroker1.GetComputerForProgID
(DCOMConnection1.ServerName); // 取得可用应用程序服务器的机器名称
DCOMConnection1.Connected := True;
ClientDataSet1.ApplyUpdates(0);
except
on EBrokerException do
ClientDataSet1.SaveToFile('Sample.Dat'); // 保存数据
end;
end;
end;
end;
end;
procedure TdmArchiveConnect.Connect;
var
FIniFileName: string;
begin
//设置ini文件
FIniFileName := ExtractFilePath(Application.ExeName) + 'PHYMIS.ini ';
//载入可用的应用程序服务器
ServerBroker.Servers.Items[0].ComputerName := ReadIniString(FIniFileName,
'Server ', 'Server1 ', ' ');
ServerBroker.Servers.Items[1].ComputerName := ReadIniString(FIniFileName,
'Server ', 'Server2 ', ' ');
ServerBroker.Servers.Items[2].ComputerName := ReadIniString(FIniFileName,
'Server ', 'Server3 ', ' ');
//设定应用程序服务器
scktArchive.ServerName := 'pArchiveServer.ArchiveAgent ';
scktArchive.ServerGUID := '{0334ABD2-9792-459C-8036-3288678678F5} ';
//载入端口设置
scktArchive.Port := StrToInt(ReadIniString(FIniFileName, 'Server ', 'Port ',
'211 '));
//连接应用程序服务器
if scktArchive.Connected then
scktArchive.Connected := False;
try
scktArchive.Connected := True;
ServerCanUse := True;
except
ErrBox( '无法连接到应用程序服务器,请检查网络设置 ');
ServerCanUse := False;
end;
end;