【问题标题】:How to work with TDSSessionManager.Instance.foreachsession (Delphi XE5)如何使用 TDSSessionManager.Instance.foreachsession (Delphi XE5)
【发布时间】:2014-03-24 16:32:41
【问题描述】:

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

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

我想拒绝其他客户端以相同的值连接,直到第一个连接完成他的工作。

如何遍历所有会话并将 IDRETEA 与当前会话中找到的值进行比较? (基于一些符合逻辑的业务)。

我有点想在 过程 TsrvContainer.dssServerMainConnect(DSConnectEventObject: TDSConnectEventObject);

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

【问题讨论】:

    标签: delphi-xe5 datasnap


    【解决方案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)
    

    【讨论】:

      【解决方案2】:
      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;
      

      【讨论】:

      • 嗨,欢迎来到堆栈溢出。您能否提供更多详细信息,说明您的答案为何?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-22
      相关资源
      最近更新 更多