2014-03-24 118 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