HeartBeatCheckJob.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. using EVCB_OCPP.Domain;
  2. using EVCB_OCPP.Domain.Models.Database;
  3. using Microsoft.EntityFrameworkCore;
  4. using Microsoft.Extensions.Logging;
  5. using OCPPServer.Protocol;
  6. using Quartz;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Diagnostics;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. namespace EVCB_OCPP.WSServer.Jobs
  14. {
  15. [DisallowConcurrentExecution]
  16. public class HeartBeatCheckJob : IJob
  17. {
  18. public HeartBeatCheckJob(
  19. ProtalServer protalServer,
  20. IDbContextFactory<MainDBContext> maindbContextFactory,
  21. ILogger<HeartBeatCheckJob> logger)
  22. {
  23. this.protalServer = protalServer;
  24. this.maindbContextFactory = maindbContextFactory;
  25. this.logger = logger;
  26. }
  27. private readonly ProtalServer protalServer;
  28. private readonly IDbContextFactory<MainDBContext> maindbContextFactory;
  29. private readonly ILogger<HeartBeatCheckJob> logger;
  30. public async Task Execute(IJobExecutionContext context)
  31. {
  32. logger.LogDebug("{0} Started", nameof(HeartBeatCheckJob));
  33. try
  34. {
  35. Stopwatch watch = new Stopwatch();
  36. Dictionary<string, ClientData> _copyClientDic = protalServer.ClientDic;
  37. var cdt = DateTime.UtcNow;
  38. var clients = _copyClientDic.Where(x => x.Value.LastActiveTime > cdt.AddSeconds(-120)).Select(x => x.Value).ToList();
  39. watch.Start();
  40. var wssClients = clients.Where(x => x.UriScheme.Equals("wss")).ToList();
  41. var wsClients = clients.Except(wssClients).ToList();
  42. using (var db = await maindbContextFactory.CreateDbContextAsync())
  43. {
  44. foreach (var session in wssClients)
  45. {
  46. var machine = new Machine() { Id = session.MachineId };
  47. if (machine != null)
  48. {
  49. //db.Configuration.AutoDetectChangesEnabled = false;
  50. //db.Configuration.ValidateOnSaveEnabled = false;
  51. db.Machine.Attach(machine);
  52. machine.HeartbeatUpdatedOn = DateTime.UtcNow;
  53. machine.ConnectionType = 2;
  54. db.Entry(machine).Property(x => x.HeartbeatUpdatedOn).IsModified = true;
  55. db.Entry(machine).Property(x => x.ConnectionType).IsModified = true;
  56. }
  57. }
  58. await db.SaveChangesAsync();
  59. }
  60. using (var db = await maindbContextFactory.CreateDbContextAsync())
  61. {
  62. foreach (var session in wsClients)
  63. {
  64. var machine = new Machine() { Id = session.MachineId };
  65. if (machine != null)
  66. {
  67. //db.Configuration.AutoDetectChangesEnabled = false;
  68. //db.Configuration.ValidateOnSaveEnabled = false;
  69. db.Machine.Attach(machine);
  70. machine.HeartbeatUpdatedOn = DateTime.UtcNow;
  71. machine.ConnectionType = 1;
  72. db.Entry(machine).Property(x => x.HeartbeatUpdatedOn).IsModified = true;
  73. db.Entry(machine).Property(x => x.ConnectionType).IsModified = true;
  74. }
  75. }
  76. await db.SaveChangesAsync();
  77. }
  78. //foreach (var session in clients)
  79. //{
  80. // using (var db = await maindbContextFactory.CreateDbContextAsync())
  81. // {
  82. // var machine = new Machine() { Id = session.MachineId };
  83. // if (machine != null)
  84. // {
  85. // //db.Configuration.AutoDetectChangesEnabled = false;
  86. // //db.Configuration.ValidateOnSaveEnabled = false;
  87. // db.Machine.Attach(machine);
  88. // machine.HeartbeatUpdatedOn = DateTime.UtcNow;
  89. // machine.ConnectionType = session.UriScheme.Equals("wss") ? 2 : 1;
  90. // db.Entry(machine).Property(x => x.HeartbeatUpdatedOn).IsModified = true;
  91. // db.Entry(machine).Property(x => x.ConnectionType).IsModified = true;
  92. // await db.SaveChangesAsync();
  93. // }
  94. // }
  95. //}
  96. watch.Stop();
  97. if (watch.ElapsedMilliseconds / 1000 > 5)
  98. {
  99. logger.LogCritical("Update HeartBeatCheckTrigger cost " + watch.ElapsedMilliseconds / 1000 + " seconds.");
  100. }
  101. }
  102. catch (Exception ex)
  103. {
  104. Console.WriteLine("***********************************************************");
  105. logger.LogError(string.Format("HeartBeatCheckTrigger Ex:{0}", ex.ToString()));
  106. }
  107. }
  108. }
  109. }