RPC mit fortlaufenden Ergebnissen

· Funktionen

WAMP 1.0 ist ein offenes WebSocket-Subprotokoll, das zwei asynchrone Messaging-Muster bietet: RPC und PubSub.

Ab sgcWebSockets 4.3.8 wird eine neue Methode unterstützt, die nicht Teil der WAMP-1.0-Spezifikation ist, aber für unsere Nutzer sehr nützlich sein kann. WAMP erlaubt RPC-Aufrufe, aber die Server-Antwort kann nur erfolgreich oder nicht erfolgreich sein. Manchmal benötigt ein RPC mehr als ein Ergebnis (Streaming-Nachrichten, Kurse, Fortschrittsanzeige ...) und hier erlaubt die Spezifikation das nicht (WAMP 2.0 erlaubt es, ist aber viel komplexer).

Ab sgcWebSockets 4.3.8 ist daher RPC mit mehreren Ergebnissen verfügbar.

Grundsätzlich funktioniert es genauso wie der bisherige RPC, aber auf der Client-Seite gibt es ein neues Ereignis OnCallProgressResult, das ausgelöst wird, wenn der Server ein Teilergebnis sendet und noch weitere Ergebnisse folgen. Gleichzeitig hat der Server eine neue Methode CallProgressResult, mit der ein Teilergebnis an den Client gesendet wird. 

Der Client kann einen aktiven RPC-Aufruf mit der neuen Methode CancelCall abbrechen, indem er die CallId als Parameter übergibt.

Server-Beispiel 

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; 

Client-Beispiel 

procedure OnCallResultClient(Connection: TsgcWSConnection; CallId, Result: string);
begin
  // This is the last result
  ShowMessage(Result);
end;
procedure OnCallProgressResultClient(Connection: TsgcWSConnection; CallId, Result: string);
begin
  // Partial result, there are still more results to receive
  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('GetProgressiveTime');