我在理解如何使用TDSSessionManager.Instance的foreachsession方法时遇到问题。 (如果有人,我需要一个例子)。一个真实的例子。
我想做以下事情: 一个客户端连接到我的DataSnap服务器。 我在会话中保存了一个值。像这样...... session.PutData(' IDRETEA'," 1");
我想在第一次连接完成工作之前拒绝其他连接相同值的客户端。
如何通过所有会话进行迭代并将IDRETEA与我当前会话中的值进行比较? (基于一些商业逻辑)。
我有点想要实现这种行为 过程TsrvContainer.dssServerMainConnect(DSConnectEventObject:TDSConnectEventObject);
这里我有所有的值,如果我找到另一个用户并且客户端将知道恢复工作(1,2,3分钟后),服务器正忙着"那么我可以引发异常。现在
答案 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;