xtool/contrib/mORMot/SQLite3/Samples/31 - WebSockets/Project31LongWorkClient.dpr

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.