HeartBeatCheckJob.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. using EVCB_OCPP.Domain;
  2. using EVCB_OCPP.Domain.Models.Database;
  3. using EVCB_OCPP.WSServer.Service;
  4. using EVCB_OCPP.WSServer.Service.WsService;
  5. using Microsoft.EntityFrameworkCore;
  6. using Microsoft.Extensions.Logging;
  7. using OCPPServer.Protocol;
  8. using Quartz;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Diagnostics;
  12. using System.Linq;
  13. using System.Text;
  14. using System.Threading.Tasks;
  15. namespace EVCB_OCPP.WSServer.Jobs;
  16. [DisallowConcurrentExecution]
  17. public class HeartBeatCheckJob : IJob
  18. {
  19. public HeartBeatCheckJob(
  20. ProtalServer protalServer,
  21. IDbContextFactory<MainDBContext> maindbContextFactory,
  22. IMainDbService mainDbService,
  23. ILogger<HeartBeatCheckJob> logger)
  24. {
  25. this.protalServer = protalServer;
  26. this.maindbContextFactory = maindbContextFactory;
  27. this.mainDbService = mainDbService;
  28. this.logger = logger;
  29. }
  30. private readonly ProtalServer protalServer;
  31. private readonly IDbContextFactory<MainDBContext> maindbContextFactory;
  32. private readonly IMainDbService mainDbService;
  33. private readonly ILogger<HeartBeatCheckJob> logger;
  34. public async Task Execute(IJobExecutionContext context)
  35. {
  36. //logger.LogDebug("{0} Started", nameof(HeartBeatCheckJob));
  37. try
  38. {
  39. Stopwatch watch = new Stopwatch();
  40. Dictionary<string, WsClientData> _copyClientDic = protalServer.GetClientDic();
  41. var cdt = DateTime.UtcNow;
  42. var clients = _copyClientDic.Where(x => x.Value.LastActiveTime > cdt.AddSeconds(-120)).Select(x => x.Value).ToList();
  43. watch.Start();
  44. //var datas = new List<Machine>();
  45. //foreach (var session in clients)
  46. //{
  47. // var machine = new Machine() { Id = session.MachineId, HeartbeatUpdatedOn = cdt, ConnectionType = session.UriScheme.Equals("wss") ? 2 : 1 };
  48. // datas.Add(machine);
  49. //}
  50. //await mainDbService.UpdateHeartBeats(datas);
  51. var toUpdateMachineIds = clients.Select(x => x.MachineId).ToList();
  52. await mainDbService.UpdateHeartBeats(toUpdateMachineIds);
  53. watch.Stop();
  54. if (watch.ElapsedMilliseconds / 1000 > 5)
  55. {
  56. logger.LogCritical("Update HeartBeatCheckTrigger cost " + watch.ElapsedMilliseconds / 1000 + " seconds.");
  57. }
  58. }
  59. catch (Exception ex)
  60. {
  61. Console.WriteLine("***********************************************************");
  62. logger.LogError(string.Format("HeartBeatCheckTrigger Ex:{0}", ex.ToString()));
  63. }
  64. }
  65. }