91 lines
2.6 KiB
ObjectPascal
91 lines
2.6 KiB
ObjectPascal
/// simple SOA client using a callback for long process ending notification
|
|
program Project31LongWorkClient;
|
|
|
|
uses
|
|
{$I SynDprUses.inc} // use FastMM4 on older versions of Delphi
|
|
SysUtils,
|
|
Classes,
|
|
SynCommons,
|
|
SynTable,
|
|
mORMot,
|
|
mORMotHttpClient,
|
|
Project31LongWorkCallbackInterface in 'Project31LongWorkCallbackInterface.pas';
|
|
|
|
{$APPTYPE CONSOLE}
|
|
|
|
type
|
|
TLongWorkCallback = class(TInterfacedCallback,ILongWorkCallback)
|
|
protected
|
|
procedure WorkFinished(const workName: string; timeTaken: integer);
|
|
procedure WorkFailed(const workName, error: string);
|
|
end;
|
|
|
|
procedure TLongWorkCallback.WorkFailed(const workName, error: string);
|
|
begin
|
|
TextColor(ccLightRed);
|
|
writeln(#13'Received callback WorkFailed(',workName,') with message "',error,'"');
|
|
TextColor(ccLightGray);
|
|
write('>');
|
|
end;
|
|
|
|
procedure TLongWorkCallback.WorkFinished(const workName: string;
|
|
timeTaken: integer);
|
|
begin
|
|
TextColor(ccLightBlue);
|
|
writeln(#13'Received callback WorkFinished(',workName,') in ',timeTaken,'ms');
|
|
TextColor(ccLightGray);
|
|
write('>');
|
|
end;
|
|
|
|
|
|
procedure Run;
|
|
var Client: TSQLHttpClientWebsockets;
|
|
workName: string;
|
|
Service: ILongWorkService;
|
|
callback: ILongWorkCallback;
|
|
begin
|
|
writeln('Connecting to the local Websockets server...');
|
|
Client := TSQLHttpClientWebsockets.Create('127.0.0.1','8888',TSQLModel.Create([]));
|
|
try
|
|
Client.Model.Owner := Client;
|
|
Client.WebSocketsUpgrade(PROJECT31_TRANSMISSION_KEY);
|
|
if not Client.ServerTimeStampSynchronize then
|
|
raise EServiceException.Create(
|
|
'Error connecting to the server: please run Project31LongWorkServer.exe');
|
|
Client.ServiceDefine([ILongWorkService],sicShared);
|
|
if not Client.Services.Resolve(ILongWorkService,Service) then
|
|
raise EServiceException.Create('Service ILongWorkService unavailable');
|
|
TextColor(ccWhite);
|
|
writeln('Please type a work name, then press [Enter]');
|
|
writeln('Enter a void line to quit');
|
|
callback := TLongWorkCallback.Create(Client,ILongWorkCallback);
|
|
try
|
|
repeat
|
|
TextColor(ccLightGray);
|
|
write('>');
|
|
readln(workName);
|
|
if workName='' then
|
|
break;
|
|
Service.StartWork(workName,callback);
|
|
TextColor(ccBrown);
|
|
writeln('Service.TotalWorkCount=',Service.TotalWorkCount);
|
|
until false;
|
|
finally
|
|
callback := nil;
|
|
Service := nil; // release the service local instance BEFORE Client.Free
|
|
end;
|
|
finally
|
|
Client.Free;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
begin
|
|
try
|
|
Run;
|
|
except
|
|
on E: Exception do
|
|
ConsoleShowFatalException(E);
|
|
end;
|
|
end.
|