WAMP | Progresywne wyniki RPC

Czasem zdalne wywołania procedur wymagają więcej niż jednego wyniku do zakończenia żądań. Domyślnie protokół WAMP 1.0 nie obsługuje wyników częściowych w wywołaniu — jest to funkcja dostępna wyłącznie w bibliotece sgcWebSockets.

Przepływ jest bardzo podobny do prostego wywołania RPC, jednak tutaj przed finalnym wywołaniem CallResult pojawia się jeden lub więcej wyników częściowych.

Ogólnie rzecz biorąc, klient wysyła żądanie procedury do serwera, a serwer może odesłać wynik lub błąd. Jeśli odsyła wynik, może to być wynik końcowy lub musi odesłać więcej wyników później. Jeśli jest to wynik końcowy, zostanie wywołana metoda CallResult i proces dobiegnie końca. Jeśli jest więcej wyników do wysłania, zostanie wywołana metoda CallProgressResult.

 

Przykład: klient żąda od serwera metody, która będzie zwracać czas serwera co sekundę i zatrzyma się po 20 wiadomościach.

 

Serwer WAMP

 


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;

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