2014-03-24 152 views
0

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

我想要执行以下操作: 一个客户端连接到我的DataSnap服务器。 我在会话中保存了一个值。像这样... session.PutData('IDRETEA',“1”);

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

如何迭代所有会话并将IDRETEA与我当前会话中查找到的值进行比较? (基于一些商务逻辑)。我有点想在 过程TsrvContainer.dssServerMainConnect(DSConnectEventObject:TDSConnectEventObject);实现此行为。

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

回答

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) 
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; 
+5

嗨,欢迎栈溢出。你能提供一些关于为什么这是你的答案的更多细节? – Stefan