static void GatewayTenSecJobs(object sender, EventArgs e)
{
nbWaitToExecute--;
if (nbWaitToExecute > 0)
return;
nbWaitToExecute = 3;
List<WorkerChain> toWakeUp;
/*lock (lockChainManagement)
{
toWakeUp = knownChains.Where(row =>
row.Side != ChainSide.DEBUG_PORT &&
row[0] is TcpReceiver &&
(Gateway.Now - row.LastMessage).TotalSeconds > Gateway.ECHO_INTERVAL).ToList();
}*/
toWakeUp = knownChains.Where(row =>
row.Side != ChainSide.DEBUG_PORT &&
row[0] is TcpReceiver &&
(Gateway.Now - row.LastMessage).TotalSeconds > Gateway.ECHO_INTERVAL).ToList();
foreach (WorkerChain chain in toWakeUp)
{
DataPacket newPacket = DataPacket.Create(0, null);
newPacket.Command = 23;
if (chain.Side == ChainSide.SERVER_CONN)
{
newPacket.Destination = chain.ServerEndPoint;
InfoService.EchoSent[newPacket.Destination] = new Record();
if (Log.WillDisplay(System.Diagnostics.TraceEventType.Verbose))
Log.TraceEvent(System.Diagnostics.TraceEventType.Verbose, chain.ChainId, "Sending echo to server " + (newPacket.Destination == null ? "" : newPacket.Destination.ToString()));
TcpManager.SendIocPacket(null, newPacket);
}
else
{
newPacket.Destination = chain.ClientEndPoint;
InfoService.EchoSent[newPacket.Destination] = new Record();
if (Log.WillDisplay(System.Diagnostics.TraceEventType.Verbose))
Log.TraceEvent(System.Diagnostics.TraceEventType.Verbose, chain.ChainId, "Sending echo to client " + (newPacket.Destination == null ? "" : newPacket.Destination.ToString()));
TcpManager.SendClientPacket(newPacket);
}
}
toWakeUp = knownChains.Where(row =>
row.Side != ChainSide.DEBUG_PORT &&
row[0] is TcpReceiver &&
(Gateway.Now - row.LastMessage).TotalSeconds > Gateway.ECHO_INTERVAL*2).ToList();
foreach (WorkerChain chain in toWakeUp)
{
chain.Dispose();
}
// Cleanup server chains (IOC) which are not used since more than Gateway.IOC_KEEP_ALIVE_CONNECTION
List<WorkerChain> toDrop;
/*lock (lockChainManagement)
{
toDrop = knownChains
.Where(row => row.Side == ChainSide.SERVER_CONN
&& row.usedBy.Count == 0
&& row.lastNonUsed != null
&& (Gateway.Now - row.lastNonUsed.Value).TotalSeconds > Gateway.IOC_KEEP_ALIVE_CONNECTION).ToList();
}*/
toDrop = knownChains
.Where(row => row.Side == ChainSide.SERVER_CONN
&& row.usedBy.Count == 0
&& row.lastNonUsed != null
&& (Gateway.Now - row.lastNonUsed.Value).TotalSeconds > Gateway.IOC_KEEP_ALIVE_CONNECTION).ToList();
List<string> chainRemoved=new List<string>();
foreach (WorkerChain chain in toDrop)
{
if (chainRemoved.Contains(chain.ServerEndPoint.ToString()))
continue;
chainRemoved.Add(chain.ServerEndPoint.ToString());
if (Log.WillDisplay(System.Diagnostics.TraceEventType.Stop))
Log.TraceEvent(System.Diagnostics.TraceEventType.Stop, chain.chainId, "IOC Chain too old: " + chain.ServerEndPoint);
TcpManager.DropServerConnection(chain);
chain.Dispose();
}
// Cleanup client chains (MEDM) which didn't send any message for at least 2x KEEP_ALIVE
/*lock (lockChainManagement)
{
toDrop = knownChains
.Where(row => row.Side != ChainSide.DEBUG_PORT
&& row.Side != ChainSide.SERVER_CONN
&& row[0] is TcpReceiver
&& (Gateway.Now - row.LastMessage).TotalSeconds > Gateway.ECHO_INTERVAL * 2).ToList();
}*/
toDrop = knownChains
.Where(row => row.Side != ChainSide.DEBUG_PORT
&& row.Side != ChainSide.SERVER_CONN
&& row[0] is TcpReceiver
&& (Gateway.Now - row.LastMessage).TotalSeconds > Gateway.ECHO_INTERVAL * 2).ToList();
foreach (WorkerChain chain in toDrop)
{
if (Log.WillDisplay(System.Diagnostics.TraceEventType.Stop))
Log.TraceEvent(System.Diagnostics.TraceEventType.Stop, chain.chainId, "Chain is not talking anymore: " + chain.ClientEndPoint);
TcpManager.DropClientConnection(chain.ClientEndPoint);
}
}