Implement CallBack

Hi,
It’s possible implements callback in server Codefirst ?

If yes, how make ?

Important: I use Delphi Berlin

what do you mean under callback? events?

Hi, EvgenyK.

I mean notify the client application about progress in executing method, for example.

Important: I use Channel SuperTCP with code-first.

pls review the SuperTCP Channel Chat (CodeFirst) sample.
it demonstrates how to use eventsinks:

declaration:

type
  [ROEventSink]
  IChatEvents = interface(IROEventSink)
  ['{C456D3B2-E44A-4FA6-8F71-3838D7F7525B}']
    procedure Message(const From: UnicodeString; const Target: UnicodeString; 
                                    const Message: UnicodeString);
...
  end;

code:

var
  ev: IROEventWriter<IChatEvents>;
begin
...
  ev := (EventRepository.GetWriter<IChatEvents>(session.SessionID));
  ev.ExcludeSender := False;
  ev.SessionList.Add(aDestGuid);
  ev.Event.Message(VarToStr(Session['nick']), TargetNickname, Message);

I think I’m doing something wrong because my client side doesn’t recive de messages sent by server side.
Follows the way I implemented it.

Client side:

 	ROEventReceiver.RegisterEventHandlers([EID_VsCallBackEvents], [Self]);
 	ROEventReceiver.Activate;

_intf file classes:

 const EID_VsCallBackEvents = 'VsCallBackEvents';
 IVsCallBackEvents = interface(IROEventSink)
   ['{9812b95f-4c82-41e2-89d8-8e4849441c30}']
     procedure Message(const Message: UnicodeString);
   end;

Server side:

[ROEventSink]
  IVsCallBackEvents = interface(IROEventSink)
  ['{DD8FDD96-A93C-4357-BBAB-AE512970BA61}']
    procedure Message(const Message: UnicodeString);
  end;


procedure TdmServerModuleSessionPadraoBase.CallBackExample;
var
  ev: IROEventWriter<IVsCallBackEvents>;
  I: Integer;
begin
  RegisterEventClient(WidestringToAnsiString(GuidToString(Session.SessionID)), 'VsCallBackEvents');
  //ev := (frmServerPrinc.GetContainer.EventRepository.GetWriter<IVsCallBackEvents>(ClientID));
  ev := (frmServerPrinc.GetContainer.EventRepository.GetWriter<IVsCallBackEvents>(Session.SessionID));
  ev.ExcludeSender := False;
  ev.SessionList.Add(GuidToString(Session.SessionID));
  for I := 1 to 3 do
    begin
    ev.Event.Message('Teste ' + IntToStr(I));
    Sleep(5000);
  end;
end;

My Server classfactory:

initialization
  ServerModuleSessionPadraoFactory := TROPerClientClassFactory.Create(
    _SessionServiceName, Create_ServerModuleSession, TRORTTIInvoker,15*60);

Thanks!

it works for me.
testcase.zip (220.8 KB)

Hi @EvgenyK,

It’s works. My ROInMemoryEventRepository was not associated in my ROSuperTCPServer.

Thank you for your help.

Please allow me one more question. Considering that we are working with asynchonous events to receive de callback’s, in your attached example, what is the best way to receive result of the server method?

You can receive it in End* method, e.g. End* method can contain Result and var/out parameters.
In the Mega Demo sample, End* methods have such declarations:

    function EndGetServerTime(const aRequest: IROAsyncRequest): DateTime;
    procedure EndSomeTypes(out aString: string; out aWidestring: UnicodeString; 
                     out anInteger: Integer; out aCurrency: Currency; 
                     out aDatetime: DateTime; const aRequest: IROAsyncRequest);
1 Like