WAMP | RPC-voortgangsresultaten

Soms vereisen Remote Procedure Calls meer dan één resultaat om verzoeken af te ronden. Standaard staat het WAMP 1.0-protocol geen gedeeltelijke resultaten toe in een aanroep; dit is een functie die exclusief is voor de sgcWebSockets-bibliotheek.

De stroom lijkt sterk op een eenvoudige RPC, maar hier zijn er één of meer gedeeltelijke resultaten voordat CallResult wordt aangeroepen om het proces af te ronden.

In principe vraagt een client een procedure op bij de server, en de server kan een resultaat of een fout terugsturen. Als het een resultaat stuurt, kan dit het uiteindelijke resultaat zijn of moet het later meer resultaten sturen. Als het het uiteindelijke resultaat is, wordt de methode CallResult aangeroepen en is het proces afgerond. Als er meer resultaten te sturen zijn, wordt de methode CallProgressResult aangeroepen.

 

Voorbeeld: client vraagt server een methode om elke seconde de servertijd te ontvangen en na 20 berichten te stoppen.

 

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');