SafeDispatch/SafeMobileLIB_DLL/Modules/AppServerMonitoring.cs
2024-02-22 18:43:59 +02:00

103 lines
3.0 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace SafeMobileLib.Modules
{
public class AppServerMonitoring
{
public static int APP_SERVER_HEARTBEAT_SEC = 5;
#if DEBUG
public int MISSED_INTERVALS = 240;
#else
public int MISSED_INTERVALS = 24;
#endif
// thread to check at periodic time
private Thread monitoringThread;
// flag that the monitoring should be running or not
private bool isRunning = false;
private bool isUnreachable = false;
private DateTime _lastAppServerHeartbeat;
public DateTime lastAppServerHeartbeat
{
get { return _lastAppServerHeartbeat; }
set { _lastAppServerHeartbeat = value; }
}
public AppServerMonitoring()
{
_lastAppServerHeartbeat = new DateTime(0);
}
public void NewHeartBeatReceived()
{
if (isUnreachable)
{
isUnreachable = false;
OnAppServerReacheableAgain?.Invoke();
}
// set the last app server heartbeat to now
lastAppServerHeartbeat = DateTime.Now;
}
/// <summary>
/// Start the thread which will manage the monitoring of the usb device plug & unplug
/// </summary>
public void StartAppServerMonitoring()
{
if (this.isRunning)
return;
this.isRunning = true;
monitoringThread = new Thread(new ThreadStart(MonitoringThreadHandler));
monitoringThread.Start();
}
/// <summary>
/// Stop the thread which is monitoring the detection of application server is on or off
/// </summary>
public void StopMonitoring()
{
this.isRunning = false;
}
/// <summary>
/// Thread function
/// </summary>
private void MonitoringThreadHandler()
{
int count = -1;
while (isRunning)
{
// wait until checking again
Thread.Sleep(500);
// trigger event if more than two interval are missed and it at least one App Server heartbeat was received
if(lastAppServerHeartbeat.Year > 2015 &&
(new TimeSpan(DateTime.Now.Ticks - lastAppServerHeartbeat.Ticks)).TotalSeconds > APP_SERVER_HEARTBEAT_SEC * MISSED_INTERVALS
&& !isUnreachable)
{
isUnreachable = true;
OnAppServerUnreacheable?.Invoke();
}
}
}
public delegate void AppServerUnreacheable();
public event AppServerUnreacheable OnAppServerUnreacheable;
public delegate void AppServerReacheableAgain();
public event AppServerReacheableAgain OnAppServerReacheableAgain;
}
}