/// <summary> /// 添加通信应用任务 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="model"></param> /// <param name="excludeAppId"></param> /// <returns></returns> public bool Add <T>(T model, int excludeAppId = 0) where T : AppNoticePostDataModel { bool isSuccess = true; string postDataJsonStr = JsonConvert.SerializeObject(model); // 此种 通信任务 - API 类型 // 注意: 通信API Name 应与 类型名称相同 // 通信API: UHub.Web.Api.xxxModel string taskInfoName = nameof(T).Replace("Model", ""); TaskInfo taskInfo = _dbContext.TaskInfo.FirstOrDefault(m => m.Name == taskInfoName && m.TaskType == AppNoticeTask.TaskType); if (taskInfo == null) { return(false); } List <AppInfo> appInfos = _dbContext.AppInfo.Where(m => m.ID != excludeAppId).ToList(); foreach (var app in appInfos) { AppNoticeTaskDataModel taskData = new AppNoticeTaskDataModel { AppId = app.ID, PostData = postDataJsonStr }; string taskDataJsonStr = JsonConvert.SerializeObject(taskData); TaskQueue taskQueue = new TaskQueue { TaskInfo = taskInfo, CreateTime = DateTime.UtcNow, LastUpdateTime = DateTime.UtcNow, ExecCount = 0, ExpireTime = DateTime.UtcNow.AddMinutes(_options.TaskExpireAfter), TaskState = TaskStateEnum.WithoutExec, TaskData = taskDataJsonStr }; _dbContext.TaskQueue.Add(taskQueue); } _dbContext.SaveChanges(); return(isSuccess); }
protected override void DoWork(object state) { using (var scope = _serviceScopeFactory.CreateScope()) { ApplicationDbContext dbContext = scope.ServiceProvider.GetRequiredService <ApplicationDbContext>(); try { #region 执行应用通信任务 // 遍历 TaskQueue 表,执行其中的通信任务 IList <TaskQueue> taskQueues = dbContext.TaskQueue.Include(m => m.TaskInfo) .Where(m => m.TaskState != TaskStateEnum.CompletedAndSuccess && m.ExecCount <_options.TaskMaxExecCount && m.ExpireTime> DateTime.UtcNow && m.TaskInfo.TaskType == AppNoticeTask.TaskType ) .OrderBy(m => m.ID).ToList(); IList <AppInfo> appInfos = dbContext.AppInfo.ToList(); foreach (var taskQueue in taskQueues) { TaskInfo taskInfo = taskQueue.TaskInfo; AppNoticeTaskDataModel dataModel = JsonConvert.DeserializeObject <AppNoticeTaskDataModel>(taskQueue.TaskData); // 根据 AppId 查出应用 baseUrl AppInfo appInfo = appInfos.Where(m => m.ID == dataModel.AppId).FirstOrDefault(); if (appInfo == null) { // 此 应用已不存在 continue; } string appBaseUrl = appInfo?.BaseUrl; var taskParameterModel = new AppNoticeTaskParameterModel() { AppUrl = appBaseUrl + "/" + taskInfo.Name, AppSecret = appInfo.AppSecret, PostData = dataModel.PostData }; // 执行通信任务 - > 是否成功 bool isSuccess = taskParameterModel.Execute(); taskQueue.ExecCount = taskQueue.ExecCount + 1; taskQueue.LastUpdateTime = DateTime.UtcNow; if (isSuccess) { taskQueue.SuccessTime = DateTime.UtcNow; taskQueue.TaskState = TaskStateEnum.CompletedAndSuccess; } else { taskQueue.TaskState = TaskStateEnum.CompletedAndFailure; } dbContext.TaskQueue.Update(taskQueue); dbContext.SaveChanges(); } #endregion } catch (Exception ex) { Console.WriteLine("数据库未创建, 任务暂时不会执行"); } } }