WAMP | Risultati di avanzamento RPC

A volte le chiamate di procedura remota richiedono più di un risultato per completare le richieste; per impostazione predefinita il protocollo WAMP 1.0 non consente risultati parziali in una chiamata, questa è una funzionalità esclusiva della libreria sgcWebSockets.

Il flusso è molto simile a un semplice RPC, ma qui ci sono 1 o più risultati parziali prima che CallResult venga chiamato per terminare il processo.

Fondamentalmente, un client richiede una procedura al server, e il server può inviare un risultato o un errore. Se invia un risultato, questo può essere il risultato finale oppure deve inviare ulteriori risultati in seguito. Se è il risultato finale, chiamerà il metodo CallResult e il processo sarà terminato. Se ci sono altri risultati da inviare, chiamerà il metodo CallProgressResult.

 

Esempio: il client richiede al server un metodo per ricevere ogni secondo l'orario del server e fermarsi dopo 20 messaggi.

 

WAMP Server

 


procedure OnServerCall(Connection: TsgcWSConnection; const CallId, ProcUri, Arguments: string);
var
  vNum: Integer;
begin
  if ProcUri = 'GetProgressiveTime' then
  begin
    vNum := StrToInt(Arguments);
    for i := 1 to vNum do
	begin
	  if i = 20 then
        oServerWAMP.CallResult(CallId, FormatDateTime('yyyymmdd hh:nn:ss', Now))
	  else
	    oServerWAMP.CallProgressiveResult(CallId, FormatDateTime('yyyymmdd hh:nn:ss', Now));
	end
  end
  else
    oServer.WAMP.CallError(CallId, 'Unknown method');
end;
oServer := TsgcWebSocketServer.Create(nil);
oServer.Port := 80;
oServerWAMP := TsgcWSPServer_WAMP.Create(nil);
oServerWAMP.OnCall := OnServerCallEvent;
oServerWAMP.Server := oServer;
oServer.Active := True;

WAMP Client

 


procedure OnCallResultClient(Connection: TsgcWSConnection; CallId, Result: string);
begin
  ShowMessage(Result);
end;
procedure OnCallProgressResultClient(Connection: TsgcWSConnection; CallId, Result: string);
begin
  ShowMessage(Result);
end;
procedure OnCallErrorClient(Connection: TsgcWSConnection; const Error: string);
begin
  ShowMessage(Error);
end;
oClient := TsgcWebSocketClient.Create(nil);
oClient.Host := '127.0.0.1';
oClient.Port := 80;
oClientWAMP := TsgcWSPClient_WAMP.Create(nil);
oClientWAMP.OnCallResult := OnCallResultClient;
oClientWAMP.OnCallProgressResult := OnCallProgressResultClient;
oClientWAMP.OnCallError := OnCallErrorClient;
oClientWAMP.Client := oClient;
oClient.Active := True;
// After client has connected, request GetTime from server
oClientWAMP.Call('GetProgressTime');