Jump to content

Монитор сессий и custom MainModule props


Recommended Posts

Я взял стандартный пример и использовал в своем приложении.

Задача простая: монитор сессий должен показывать какую-то дополнительную информацию, например, какое окно сейчас открыто у пользователя в браузере.

Частично задача работает. Но в custom MainModule props всегда одно и то же, как будто в UniServerModule.SessionManager.Sessions ничего не меняется.

На форме есть TuniTimes и каждые три секунды срабатывает процедура GetSessions().

Пользователь открывает и закрывает окна, а в свойстве "TUniMainModule(U.UniMainModule).SessionActiveForm" всегда один и тот же текст.

Если закрыть фрейм TfrdSessions и снова открыть, то тогда в свойстве SessionActiveForm будет уже актуальная информация.

Т.е. получается, что "S := UniServerModule.SessionManager.Sessions" не обновляется или если обновляется, то не читает custom MainModule props в частности "SessionActiveForm".

 

procedure TfrdSessions.GetSessions;
var
  S : TUniGUISessions;
  U : TUniGUISession;
  I : Integer;
  PageControl: TUniPageControl;
  TabSheet: TUniTabSheet;
begin
  //cdsSessions.DisableControls;
//  dsSessions.DataSet := nil;

//  if cdsSessions.Active then
//    cdsSessions.Close;

// если вкладка неактивна, то не обновляем данные
  if self.Owner is TUniTabSheet then
  begin
    TabSheet := TUniTabSheet(self.Owner);

    if not Assigned(TabSheet) then
      exit;

    if TabSheet.Parent is TUniPageControl then
    begin
      PageControl := TUniPageControl(TabSheet.Parent);

      if PageControl.ActivePage <> TabSheet then
      begin
        TabSheet.Caption := constSessionsMsgTabCaption;
        exit;
      end;
    end;// if TabSheet.Parent is TUniPageControl then


    S := UniServerModule.SessionManager.Sessions;
    S.Lock; // Using Lock on session manager should be used with extreme care.
            // We should keep the "Lock duration"  as short as we can. Session Manager stops working until lock is released.
            // Excessive use of lock/unlock or keeping the lock active for a long period will make uniGUI server slow/unresponsive.
    try
      SetLength(ASessionList, S.SessionList.Count);

      // Here we do a fast copy of list to another array for later use.
      for I := 0 to Pred(S.SessionList.Count)  do
      begin
        U := S.SessionList[I];
        ASessionList[I].ASessionId := U.SessionId;
        ASessionList[I].AIP := U.RemoteIP;
        ASessionList[I].ALastTime := U.LastTimeStamp;
        ASessionList[I].UserAgent := U.UserAgent;
        if Assigned(U.UniMainModule) then // Check mainModule availability. Some sessions may not have a MainModule instance
        begin
          ASessionList[I].ALogin     := TUniMainModule(U.UniMainModule).SessionUserName; // Access custom MainModule props;
          ASessionList[I].ActiveForm := TUniMainModule(U.UniMainModule).SessionActiveForm;
          ASessionList[I].DeviceInfo := TUniMainModule(U.UniMainModule).SessionDeviceType;
        end;
      end;
    finally
      S.Unlock; // ... and finally don't forget to release lock!
    end;

    //cdsSessions.DisableControls;
    try
      cdsSessions.Open;
      cdsSessions.EmptyDataSet;

      for I := Low(ASessionList) to High(ASessionList) do
      begin
        cdsSessions.Append;
        cdsSessions.FieldByName('sessionid').AsString := ASessionList[I].ASessionId;
        cdsSessions.FieldByName('ip').AsString := ASessionList[I].AIP;
        cdsSessions.FieldByName('lasttime').AsDateTime := ASessionList[I].ALastTime;
        cdsSessions.FieldByName('Login').AsString := ASessionList[I].ALogin;
        cdsSessions.FieldByName('ActiveForm').AsString := ASessionList[I].ActiveForm;
        cdsSessions.FieldByName('DeviceInfo').AsString := ASessionList[I].DeviceInfo;
        cdsSessions.FieldByName('UserAgent').AsString := ASessionList[I].UserAgent;
        cdsSessions.Post;
      end;

      if Assigned(TabSheet) then
        TabSheet.Caption := constSessionsMsgTabCaption;

     finally
      SetLength(ASessionList, 0);
      //cdsSessions.EnableControls;

    end;
  end;
end;

 

В каждой форме приложения в событии onShow я добавил строку:

UniMainModule.SessionActiveForm := self.Caption;

 

Может быть нужно выполнять как-то обновление для UniServerModule.SessionManager? Чтобы UniServerModule.SessionManager перечитывал TUniMainModule(U.UniMainModule).SessionActiveForm каждый раз, а не только при создании фрейма и при первом обращении.

Link to post
Share on other sites
  • 2 months later...

up, тоже интересна данная тема. Только задача проще, обновлять клиентский датасет с сервера, при определенных условиях, начал копать в сторону вэбсокетов, но пока не сильно продвинулся )

Link to post
Share on other sites
38 minutes ago, Dmitriy said:

обновлять клиентский датасет с сервера

вы имеете ввиду, что нужно как-то посылать что-то в браузер пользователю? как-то-то "сигнал", чтобы на клиенте была запущена процедура автоматического обновления данных в сетке?

Link to post
Share on other sites

Дмитрий, тут касательно сокетов уже столько, уже не знаю, сколько это обсасывать можно, посмотрите мой пример, посмотрите обсуждение.

Link to post
Share on other sites
  • 2 weeks later...
On 7/20/2020 at 2:14 PM, x11 said:

Я взял стандартный пример и использовал в своем приложении.

Задача простая: монитор сессий должен показывать какую-то дополнительную информацию, например, какое окно сейчас открыто у пользователя в браузере.

Частично задача работает. Но в custom MainModule props всегде одно и то же, как будто в UniServerModule.SessionManager.Sessions ничего не меняется.

На форме есть TuniTimes и каждве три секунды срабатывает процедура GetSessions().

Пользователь открывает и закрывает окна, а в свойстве "TUniMainModule(U.UniMainModule).SessionActiveForm" всегда один и то же текст.

Если закрыть фрейм TfrdSessions и снова открыть, то тогда в свойстве SessionActiveForm будет уже актуальная информация.

Т.е. получается, что "S := UniServerModule.SessionManager.Sessions" не обновляется или если обновляется, то не читает custom MainModule props в частности "SessionActiveForm".

Я попробую проанализировать Ваш вопрос. Прикрепите тестовый случай, если возможно...

Link to post
Share on other sites

Вот пытаюсь создать тестовый случай.

Открыл поставляемый с uniGUI пример "\Demos\Desktop\Session List", а скомпилировать его не удается

Quote

[dcc32 Error] Main.pas(107): E2003 Undeclared identifier: 'UnBusy'

Delphi Rio, uniGUI 1537

Link to post
Share on other sites
12 minutes ago, x11 said:
Quote

[dcc32 Error] Main.pas(107): E2003 Undeclared identifier: 'UnBusy'

 

Мы это исправим.

На данный момент Вы можете использовать следующий подход:

1.

Uses ... uniGUIApplication;

2. 

type THS = class(TUniGUISession)
end;

3. 

THS(SS).SetUnBusy;

 

Link to post
Share on other sites

Перепроверил только что рабочий проект и проблемы нет :unsure2: странно

так что пока отбой...

если снова проявится, я отправлю тестовый пример

  • Upvote 1
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...