WAMP | Resultados Progressivos de RPC

Às vezes, as Chamadas de Procedimento Remoto exigem mais de um resultado para finalizar as requisições; por padrão, o protocolo WAMP 1.0 não permite resultados parciais em uma chamada, este é um recurso exclusivo da biblioteca sgcWebSockets.

O fluxo é muito semelhante a um RPC simples, mas aqui há 1 ou mais resultados parciais antes de CallResult ser chamado para finalizar o processo.

Basicamente, um cliente solicita um procedimento ao servidor, e o servidor pode enviar um resultado ou um erro. Se ele enviar um resultado, este pode ser o resultado final ou ele deve enviar mais resultados posteriormente. Se for o resultado final, chamará o método CallResult e o processo será finalizado. Se houver mais resultados a enviar, chamará o método CallProgressResult.

 

Exemplo: o cliente requisita ao servidor um método para receber a cada segundo o horário do servidor e parar após 20 mensagens.

 

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