HostedService.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. using Microsoft.Extensions.DependencyInjection;
  2. using Microsoft.Extensions.Hosting;
  3. using Microsoft.Extensions.Logging;
  4. using Microsoft.Extensions.Options;
  5. using StackExchange.Redis;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Text;
  9. using System.Threading;
  10. using System.Threading.Tasks;
  11. using System.Linq;
  12. using System.Data;
  13. using Ropin.Inspection.Service;
  14. using Ropin.Inspection.Repository;
  15. using Ropin.Inspection.Model.Entities;
  16. using Ropin.Inspection.Model;
  17. using Newtonsoft.Json;
  18. using LinqKit;
  19. using Ropin.Inspection.Common.Helper;
  20. using Microsoft.AspNetCore.NodeServices;
  21. using Microsoft.EntityFrameworkCore;
  22. using Ropin.Core.Extensions.Redis;
  23. namespace Ropin.Inspection.Api.Work
  24. {
  25. public class HostedService : IHostedService, IDisposable
  26. {
  27. private readonly ILogger _logger;
  28. private readonly IServiceProvider _provider;
  29. private readonly IRedisBasketRepository _redisBasketRepository;
  30. private readonly IDbContextFactory<InspectionDbContext> _dbContextFactory;
  31. private readonly Func<InspectionDbContext> _dbFuncContextFactory;
  32. private readonly INodeServices _nodeServices;
  33. private readonly IPushMsgService _pushMsgService;
  34. private readonly ITdevWebScadaDevSpotRepository _devWebScadaDevSpotRepository;
  35. //private readonly ITdevDevStoreService _devDevStoreService;
  36. private readonly ITdevDevStoreRepository _tdevDevStoreRepository;
  37. public HostedService(ILogger<HostedService> logger,
  38. IServiceProvider provider,
  39. ITdevDevStoreRepository devDevStoreRepository,
  40. INodeServices nodeServices,
  41. Func<InspectionDbContext> dbContextFactory,
  42. IRedisBasketRepository redisBasketRepository,
  43. IPushMsgService pushMsgService,
  44. //IDbContextFactory<InspectionDbContext> dbContextFactory,
  45. ITdevWebScadaDevSpotRepository devWebScadaDevSpotRepository)
  46. {
  47. _logger = logger;
  48. _provider = provider;
  49. _tdevDevStoreRepository = devDevStoreRepository;
  50. _devWebScadaDevSpotRepository = devWebScadaDevSpotRepository;
  51. _nodeServices = nodeServices;
  52. // _devDevStoreService = devDevStoreService;
  53. _redisBasketRepository = redisBasketRepository;
  54. _dbFuncContextFactory = dbContextFactory;
  55. _pushMsgService = pushMsgService;
  56. //var v = _provider.GetRequiredService<IDbContextFactory<InspectionDbContext>>();
  57. //_dbContextFactory = dbContextFactory;//
  58. }
  59. private object _locker = new object();
  60. public Task StartAsync(CancellationToken cancellationToken)
  61. {
  62. Task.Run(async () =>
  63. {
  64. while (true)
  65. {
  66. try
  67. {
  68. string strMsgalarmdic = await _redisBasketRepository.GetValue("fanyibox_msgalarmdic");
  69. if (string.IsNullOrWhiteSpace(strMsgalarmdic))
  70. {
  71. Console.WriteLine("队列中数据不存在!");
  72. await _redisBasketRepository.Set("fanyibox_error", "队列中数据不存在!",new TimeSpan(2000000));
  73. }
  74. else
  75. {
  76. Dictionary<string, DeviceVlue> msgAlarmDic = JsonConvert.DeserializeObject<Dictionary<string, DeviceVlue>>(strMsgalarmdic);
  77. if (msgAlarmDic != null && msgAlarmDic.Count()>0)
  78. await SendInterval(msgAlarmDic);
  79. }
  80. await Task.Delay(100000);
  81. }
  82. catch (Exception ex)
  83. {
  84. _logger.LogError(ex.Message);
  85. await Task.Delay(1000);
  86. }
  87. }
  88. });
  89. return Task.CompletedTask;
  90. }
  91. private async Task SendInterval(Dictionary<string, DeviceVlue> msgAlarmDic)
  92. {
  93. List<Task> tasks = new List<Task>();
  94. foreach (var keyValuePair in msgAlarmDic)
  95. {
  96. tasks.Add(Task.Run(async () =>
  97. {
  98. await _pushMsgService.PushAlarmMsgAsync(new TpushMsgModel
  99. {
  100. C_DevStoreCode = keyValuePair.Value.storeCode,
  101. C_MsgTypeCode = "MSG_TYPE_001",
  102. Msg = "设备点异常" + keyValuePair.Value.name + " boxId:" + keyValuePair.Value.boxId + " " + keyValuePair.Key,
  103. Subject = "运维通知",
  104. DevNumber = "boxId:" + keyValuePair.Value.boxId + " " + keyValuePair.Key,
  105. DevName = keyValuePair.Value.name,
  106. GenerationType = 2,
  107. msgStatus = 0,
  108. },"运维通知");
  109. }));
  110. }
  111. FanyiHelper.msgAlarmDic.Clear();
  112. await _redisBasketRepository.Remove("fanyibox_msgalarmdic");
  113. //tasks.Add(Task.Run(() =>
  114. //{
  115. //}));
  116. await Task.WhenAll(tasks);
  117. }
  118. public Task StopAsync(CancellationToken cancellationToken)
  119. {
  120. Dispose();
  121. _logger.LogInformation("内部任务计划结束");
  122. return Task.CompletedTask;
  123. }
  124. public void Dispose()
  125. {
  126. //t?.Dispose();
  127. }
  128. }
  129. }