using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using StackExchange.Redis; using System; using System.Collections.Generic; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Linq; using System.Data; using Ropin.Inspection.Service; using Ropin.Inspection.Repository; using Ropin.Inspection.Model.Entities; using Ropin.Inspection.Model; using Newtonsoft.Json; using LinqKit; using Ropin.Inspection.Common.Helper; using Microsoft.AspNetCore.NodeServices; using Microsoft.EntityFrameworkCore; using Ropin.Core.Extensions.Redis; namespace Ropin.Inspection.Api.Work { public class HostedService : IHostedService, IDisposable { private readonly ILogger _logger; private readonly IServiceProvider _provider; private readonly IRedisBasketRepository _redisBasketRepository; private readonly IDbContextFactory _dbContextFactory; private readonly Func _dbFuncContextFactory; private readonly INodeServices _nodeServices; private readonly IPushMsgService _pushMsgService; private readonly ITdevWebScadaDevSpotRepository _devWebScadaDevSpotRepository; //private readonly ITdevDevStoreService _devDevStoreService; private readonly ITdevDevStoreRepository _tdevDevStoreRepository; public HostedService(ILogger logger, IServiceProvider provider, ITdevDevStoreRepository devDevStoreRepository, INodeServices nodeServices, Func dbContextFactory, IRedisBasketRepository redisBasketRepository, IPushMsgService pushMsgService, //IDbContextFactory dbContextFactory, ITdevWebScadaDevSpotRepository devWebScadaDevSpotRepository) { _logger = logger; _provider = provider; _tdevDevStoreRepository = devDevStoreRepository; _devWebScadaDevSpotRepository = devWebScadaDevSpotRepository; _nodeServices = nodeServices; // _devDevStoreService = devDevStoreService; _redisBasketRepository = redisBasketRepository; _dbFuncContextFactory = dbContextFactory; _pushMsgService = pushMsgService; //var v = _provider.GetRequiredService>(); //_dbContextFactory = dbContextFactory;// } private object _locker = new object(); public Task StartAsync(CancellationToken cancellationToken) { Task.Run(async () => { while (true) { try { string strMsgalarmdic = await _redisBasketRepository.GetValue("fanyibox_msgalarmdic"); if (string.IsNullOrWhiteSpace(strMsgalarmdic)) { Console.WriteLine("队列中数据不存在!"); await _redisBasketRepository.Set("fanyibox_error", "队列中数据不存在!",new TimeSpan(2000000)); } else { Dictionary msgAlarmDic = JsonConvert.DeserializeObject>(strMsgalarmdic); if (msgAlarmDic != null && msgAlarmDic.Count()>0) await SendInterval(msgAlarmDic); } await Task.Delay(100000); } catch (Exception ex) { _logger.LogError(ex.Message); await Task.Delay(1000); } } }); return Task.CompletedTask; } private async Task SendInterval(Dictionary msgAlarmDic) { List tasks = new List(); foreach (var keyValuePair in msgAlarmDic) { tasks.Add(Task.Run(async () => { await _pushMsgService.PushAlarmMsgAsync(new TpushMsgModel { C_DevStoreCode = keyValuePair.Value.storeCode, C_MsgTypeCode = "MSG_TYPE_001", Msg = "设备点异常" + keyValuePair.Value.name + " boxId:" + keyValuePair.Value.boxId + " " + keyValuePair.Key, Subject = "运维通知", DevNumber = "boxId:" + keyValuePair.Value.boxId + " " + keyValuePair.Key, DevName = keyValuePair.Value.name, GenerationType = 2, msgStatus = 0, },"运维通知"); })); } FanyiHelper.msgAlarmDic.Clear(); await _redisBasketRepository.Remove("fanyibox_msgalarmdic"); //tasks.Add(Task.Run(() => //{ //})); await Task.WhenAll(tasks); } public Task StopAsync(CancellationToken cancellationToken) { Dispose(); _logger.LogInformation("内部任务计划结束"); return Task.CompletedTask; } public void Dispose() { //t?.Dispose(); } } }