Files
Saxonite/SaxoniteCoreWebOnline/Online/Consoles/SaxSessionDataConsole_Online.cs
T
2022-02-16 10:47:45 +00:00

120 lines
4.2 KiB
C#

using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Utils;
using Saxonite.Net.Core.Web.Base.Consoles;
using Saxonite.Net.Standard.Base.App;
using Saxonite.Net.Standard.Base.Bus;
using Saxonite.Net.Standard.Base.Consoles;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Saxonite.Net.Core.Web.Online.Consoles
{
//=======================================================================
public class SaxSessionDataConsole_Online : SaxSessionDataConsole_Web
{
//-------------------------------------------------------------------
// Definitions.
//-------------------------------------------------------------------
// Data members.
private static SaxSessionDataConsole_Online console = null;
private System.Timers.Timer commitTimer = null;
/// <summary>Latest time that a user was active on the online system - awaiting commit to the database.</summary>
private SacsQueueDictionary<SysId, SaxUserOnline.DataProperties> usersActiveAt = new SacsQueueDictionary<SysId, SaxUserOnline.DataProperties>();
private DateTime lastDataCommit = DateTime.MinValue;
private int commitBatchSize = 32;
//-------------------------------------------------------------------
// Construction.
public SaxSessionDataConsole_Online(SaxSessionContext sessionContext) :
base(sessionContext)
{
String fn = GetType().Name + ".CTR";
if (console != null)
{
SaLogger.Info(fn + " Instance already exists");
throw new InvalidOperationException(GetType().Name + " - instance already exists.");
}
console = this;
SaLogger.Info(fn + "");
// Initilise commit timer.
commitTimer = new System.Timers.Timer(Math.Max(2, Sax.Config.Online.DataCache.RefreshIntervalSecs.Initial) * 1000);
commitTimer.Elapsed += CommitTimer_Elapsed;
commitTimer.Start();
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (Object.ReferenceEquals(console, this))
console = null;
}
base.Dispose(disposing);
}
//-------------------------------------------------------------------
// Properties.
//-------------------------------------------------------------------
// Utilities.
//-------------------------------------------------------------------
// Record User Online activity.
//-------------------------------------------------------------------
public override bool RecordUserActive(SysId userAccountId, DateTime activeAt)
{
if (!SysId.IsValid(userAccountId) || !DateUtil.IsValid(activeAt)) return false;
usersActiveAt.SetEntry(userAccountId, new SaxUserOnline.DataProperties() { UserAccountId = userAccountId, OnlineAt = activeAt });
return true;
}
//-------------------------------------------------------------------
// Commit User Online activity.
//-------------------------------------------------------------------
public override DateTime LastDataCommit()
{
lock (usersActiveAt)
return lastDataCommit;
}
private void CommitTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
commitTimer.Stop();
CommitData();
}
private void CommitData()
{
String fn = GetType().Name + ".CommitData";
commitTimer.Stop();
// Extract data to be committed.
List<KeyValuePair<SysId, SaxUserOnline.DataProperties>> usersActiveAtToCommit = usersActiveAt.RemoveTopEntries(commitBatchSize);
// Reset the timer.
int intervalSecs = Sax.Config.Online.Session.DataCommit.IntervalSecs.NoDataWaiting;
if (usersActiveAt.Count > 0)
{
// Additional Data is waiting to be committed.
intervalSecs = Sax.Config.Online.Session.DataCommit.IntervalSecs.DataWaiting;
}
commitTimer.Interval = Math.Max(1, intervalSecs) * 1000;
commitTimer.Start();
// Commit the data.
if (usersActiveAtToCommit.Count > 0)
{
if (SacsSystem.DebugMode)
SaLogger.Info(fn + " Entries to commit: " + usersActiveAtToCommit.Count);
Internals.AccountMgr.CommitUsersOnline(usersActiveAtToCommit.Select(ItemId => ItemId.Value).ToList());
}
}
//-------------------------------------------------------------------
}
//=======================================================================
}