using JT1078.Gateway.Configurations; using JT1078.Gateway.Sessions; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using System; using System.Collections.Generic; using System.Text; using System.Threading; using System.Threading.Tasks; namespace JT1078.Gateway.Jobs { internal class JT1078UdpReceiveTimeoutJob : BackgroundService { private readonly ILogger Logger; private readonly JT1078SessionManager SessionManager; private readonly IOptionsMonitor Configuration; public JT1078UdpReceiveTimeoutJob( IOptionsMonitor jT1078ConfigurationAccessor, ILoggerFactory loggerFactory, JT1078SessionManager jT1078SessionManager ) { SessionManager = jT1078SessionManager; Logger = loggerFactory.CreateLogger(); Configuration = jT1078ConfigurationAccessor; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { try { List sessionIds = new List(); foreach (var item in SessionManager.GetUdpAll()) { if (item.ActiveTime.AddSeconds(Configuration.CurrentValue.UdpReaderIdleTimeSeconds) < DateTime.Now) { sessionIds.Add(item.SessionID); } } foreach (var item in sessionIds) { SessionManager.RemoveBySessionId(item); } Logger.LogInformation($"[Check Receive Timeout]"); Logger.LogInformation($"[Session Online Count]:{SessionManager.UdpSessionCount}"); } catch (Exception ex) { Logger.LogError(ex, $"[Receive Timeout]"); } finally { await Task.Delay(TimeSpan.FromSeconds(Configuration.CurrentValue.UdpReceiveTimeoutCheckTimeSeconds), stoppingToken); } } } } }