120 lines
4.2 KiB
C#
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());
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
}
|
|
//=======================================================================
|
|
}
|