RPC Progressive Results

· 기능

WAMP 1.0은 RPC와 PubSub, 두 가지 비동기 메시징 패턴을 제공하는 개방형 WebSocket 서브프로토콜이에요.

sgcWebSockets 4.3.8부터 WAMP 1.0 명세에는 포함되지 않지만 사용자에게 매우 유용한 새 메서드를 지원해요. WAMP는 RPC 호출을 허용하지만 서버 응답은 성공 또는 실패만 가능해요. 때로는 RPC가 여러 결과를 필요로 하는 경우도 있어요(뉴스 스트리밍, 시세, 진행률 표시 등). 하지만 기존 명세에서는 이를 허용하지 않아요(WAMP 2.0에서는 허용하지만 훨씬 복잡해요).

따라서 sgcWebSockets 4.3.8부터 다중 결과를 가진 RPC를 사용할 수 있어요.

기본적으로 기존 RPC와 동일하게 동작하지만, 클라이언트 측에 OnCallProgressResult라는 새 이벤트가 추가되어 서버가 부분 결과를 보내고 아직 받을 결과가 남아 있을 때 발생해요. 동시에 서버에는 클라이언트에 부분 결과를 보내기 위해 호출하는 CallProgressResult라는 새 메서드가 있어요. 

클라이언트는 새 메서드 CancelCall을 사용하고 CallId를 파라미터로 전달해 활성 RPC 호출을 취소할 수 있어요.

서버 예제 

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; 

클라이언트 예제 

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