Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /// 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,
- 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;
- TClientWrapper = class
- private
- workName: string;
- Client: TSQLHttpClientWebsockets;
- Service: ILongWorkService;
- callback: ILongWorkCallback;
- Disconnected : Boolean;
- public
- destructor Destroy(); override;
- procedure Start();
- procedure TryToConnectAgain();
- procedure OnWebSocketsClosed(sender: TObject);
- 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
- ClientWrapper : TClientWrapper;
- begin
- writeln('Connecting to the local Websockets server...');
- ClientWrapper := TClientWrapper.Create;
- ClientWrapper.Start;
- while ClientWrapper.workName <> '' do ClientWrapper.TryToConnectAgain();
- writeln('destroy client wrapper');
- ClientWrapper.Free;
- end;
- destructor TClientWrapper.Destroy();
- begin
- inherited;
- callback := nil;
- Service := nil; // release the service local instance BEFORE Client.Free
- Client.Free;
- end;
- procedure TClientWrapper.OnWebSocketsClosed(sender: TObject);
- begin
- writeln('OnWebSocketsClosed');
- Disconnected := True;
- end;
- procedure TClientWrapper.Start();
- begin
- Client := TSQLHttpClientWebsockets.Create('127.0.0.1','8888',TSQLModel.Create([]));
- Client.Model.Owner := Client;
- Client.WebSockets.Settings.HeartbeatDelay := 3000;
- Client.WebSockets.Settings.DisconnectAfterInvalidHeartbeatCount := 2;
- Client.WebSockets.OnWebSocketsClosed := OnWebSocketsClosed;
- 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);
- write('>');
- readln(workName);
- Service.StartWork(workName,callback);
- Disconnected := False;
- end;
- procedure TClientWrapper.TryToConnectAgain();
- begin
- if Disconnected then
- begin
- writeln('after detect close connection, start again...');
- Service.StartWork(workName, Callback);
- Disconnected := False;
- end else
- begin
- Sleep(50);
- end;
- end;
- begin
- try
- Run;
- except
- on E: Exception do
- ConsoleShowFatalException(E);
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement