예제 #1
0
        /// <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);
        }
예제 #2
0
        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("数据库未创建, 任务暂时不会执行");
                }
            }
        }