如何使用TDSSessionManager.Instance.foreachsession(Delphi XE5)

时间:2014-03-24 16:32:42

标签: delphi-xe5 datasnap

我在理解如何使用TDSSessionManager.Instance的foreachsession方法时遇到问题。 (如果有人,我需要一个例子)。一个真实的例子。

我想做以下事情:  一个客户端连接到我的DataSnap服务器。  我在会话中保存了一个值。像这样...... session.PutData(' IDRETEA'," 1");

我想在第一次连接完成工作之前拒绝其他连接相同值的客户端。

如何通过所有会话进行迭代并将IDRETEA与我当前会话中的值进行比较? (基于一些商业逻辑)。

我有点想要实现这种行为  过程TsrvContainer.dssServerMainConnect(DSConnectEventObject:TDSConnectEventObject);

这里我有所有的值,如果我找到另一个用户并且客户端将知道恢复工作(1,2,3分钟后),服务器正忙着"那么我可以引发异常。现在

2 个答案:

答案 0 :(得分:1)

您可以为ForEachSession提供匿名方法,如下所示:

procedure TServerContainer1.Test;
var
  MyCurrentSession: TDSSession;
begin
  MyCurrentSession := TDSSessionManager.Instance.GetThreadSession;

  TDSSessionManager.Instance.ForEachSession(
    procedure(const Session: TDSSession)
    begin
      // This procedure will be called for each session in the TDSSessionManager
      if (Session.GetData('IDRETEA') <> '') and (MyCurrentSession.SessionName <> Session.SessionName) then
        raise Exception.Create('Server busy. Try again later.');
    end);

  MyCurrentSession.PutData('IDRETEA', 'busy');
end;

实际上你只需要提供一个带有这个签名的方法:

procedure(const Session: TDSSession)

答案 1 :(得分:0)

type
  TForm1 = class(TForm)
...
  private
    FIDETREA_ToSearch:string;    // input flag
    FIDETREA_SessionName:string; // result

    procedure EachSessionSearchIDRETEA(const Session: TDSSession);
...
  end;

....

{ return on FIDETREA_SessionName last session found with data 'IDRETEA'=FIDETREA_ToSearch }

procedure TForm1.EachSessionSearchIDRETEA(const Session: TDSSession);
begin
  if Session.GetData('IDRETEA')=FIDETREA_ToSearch then
    FIDETREA_SessionName:=Session.SessionName;
end;


procedure TForm1.Button2Click(Sender: TObject);  
begin
      FIDETREA_ToSearch:='1';   // input parameter
  FIDETREA_SessionName:=''; // result-> none
  Datasnap.DSSession.TDSSessionManager.instance.ForEachSession(EachSessionSearchIDRETEA);

  if FIDETREA_SessionName<>'' then // Found !!!!
    showmessage('Found: '+FIDETREA_SessionName)
  else
    showmessage('Not Found');
end;