WAMP | Resultados de progreso de RPC

En ocasiones, las llamadas a procedimientos remotos requieren más de un resultado para completar las solicitudes; por defecto, el protocolo WAMP 1.0 no permite resultados parciales en una llamada, esto es una característica exclusiva de la biblioteca sgcWebSockets.

El flujo es muy similar a un RPC simple, pero aquí hay 1 o más resultados parciales antes de que se llame a CallResult para finalizar el proceso.

Básicamente, un cliente solicita un procedimiento al servidor, y el servidor puede enviar un resultado o un error. Si envía un resultado, este puede ser el resultado final o debe enviar más resultados posteriormente. Si es el resultado final, llamará al método CallResult y el proceso habrá concluido. Si hay más resultados por enviar, llamará al método CallProgressResult.

 

Ejemplo: el cliente solicita al servidor un método para recibir cada segundo la hora del servidor y detenerse después de 20 mensajes.

 

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;

Cliente WAMP

 


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