Advertisement
Guest User

Untitled

a guest
Jun 17th, 2019
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 3.48 KB | None | 0 0
  1. /// simple SOA client using a callback for long process ending notification
  2. program Project31LongWorkClient;
  3.  
  4. uses
  5.   {$I SynDprUses.inc} // use FastMM4 on older versions of Delphi
  6.   SysUtils,
  7.   Classes,
  8.   SynCommons,
  9.   mORMot,
  10.   mORMotHttpClient,
  11.   Project31LongWorkCallbackInterface in 'Project31LongWorkCallbackInterface.pas';
  12.  
  13. {$APPTYPE CONSOLE}
  14.  
  15. type
  16.   TLongWorkCallback = class(TInterfacedCallback,ILongWorkCallback)
  17.   protected
  18.     procedure WorkFinished(const workName: string; timeTaken: integer);
  19.     procedure WorkFailed(const workName, error: string);
  20.   end;
  21.  
  22.  
  23.   TClientWrapper = class
  24.   private
  25.     workName: string;
  26.     Client: TSQLHttpClientWebsockets;
  27.     Service: ILongWorkService;
  28.     callback: ILongWorkCallback;
  29.     Disconnected : Boolean;
  30.   public
  31.    destructor Destroy(); override;
  32.    procedure Start();
  33.    procedure TryToConnectAgain();
  34.    procedure OnWebSocketsClosed(sender: TObject);
  35.   end;
  36.  
  37. procedure TLongWorkCallback.WorkFailed(const workName, error: string);
  38. begin
  39.   TextColor(ccLightRed);
  40.   writeln(#13'Received callback WorkFailed(',workName,') with message "',error,'"');
  41.   TextColor(ccLightGray);
  42.   write('>');
  43. end;
  44.  
  45. procedure TLongWorkCallback.WorkFinished(const workName: string;
  46.   timeTaken: integer);
  47. begin
  48.   TextColor(ccLightBlue);
  49.   writeln(#13'Received callback WorkFinished(',workName,') in ',timeTaken,'ms');
  50.   TextColor(ccLightGray);
  51.   write('>');
  52. end;
  53.  
  54.  
  55. procedure Run;
  56. var
  57.   ClientWrapper : TClientWrapper;
  58. begin
  59.   writeln('Connecting to the local Websockets server...');
  60.   ClientWrapper := TClientWrapper.Create;
  61.   ClientWrapper.Start;
  62.   while ClientWrapper.workName <> '' do ClientWrapper.TryToConnectAgain();
  63.   writeln('destroy client wrapper');
  64.   ClientWrapper.Free;
  65. end;
  66.  
  67. destructor TClientWrapper.Destroy();
  68. begin
  69.   inherited;
  70.   callback := nil;
  71.   Service := nil; // release the service local instance BEFORE Client.Free
  72.   Client.Free;
  73. end;
  74.  
  75. procedure TClientWrapper.OnWebSocketsClosed(sender: TObject);
  76. begin
  77.   writeln('OnWebSocketsClosed');
  78.   Disconnected := True;
  79. end;
  80.  
  81. procedure TClientWrapper.Start();
  82. begin
  83.   Client := TSQLHttpClientWebsockets.Create('127.0.0.1','8888',TSQLModel.Create([]));
  84.   Client.Model.Owner := Client;
  85.   Client.WebSockets.Settings.HeartbeatDelay := 3000;
  86.   Client.WebSockets.Settings.DisconnectAfterInvalidHeartbeatCount := 2;
  87.   Client.WebSockets.OnWebSocketsClosed := OnWebSocketsClosed;
  88.  
  89.   Client.WebSocketsUpgrade(PROJECT31_TRANSMISSION_KEY);
  90.   if not Client.ServerTimeStampSynchronize then
  91.     raise EServiceException.Create(
  92.       'Error connecting to the server: please run Project31LongWorkServer.exe');
  93.   Client.ServiceDefine([ILongWorkService],sicShared);
  94.   if not Client.Services.Resolve(ILongWorkService,Service) then
  95.     raise EServiceException.Create('Service ILongWorkService unavailable');
  96.   TextColor(ccWhite);
  97.   writeln('Please type a work name, then press [Enter]');
  98.   writeln('Enter a void line to quit');
  99.   callback := TLongWorkCallback.Create(Client,ILongWorkCallback);
  100.   write('>');
  101.   readln(workName);
  102.   Service.StartWork(workName,callback);
  103.   Disconnected := False;
  104. end;
  105.  
  106. procedure TClientWrapper.TryToConnectAgain();
  107. begin
  108.   if Disconnected then
  109.   begin
  110.     writeln('after detect close connection, start again...');
  111.     Service.StartWork(workName, Callback);
  112.     Disconnected := False;
  113.   end else
  114.   begin
  115.     Sleep(50);
  116.   end;
  117. end;
  118.  
  119.  
  120.  
  121. begin
  122.   try
  123.     Run;
  124.   except
  125.     on E: Exception do
  126.       ConsoleShowFatalException(E);
  127.   end;
  128. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement