コード例 #1
0
        public static CrontabSchedule ParseCron(ILogger logger, AixScheduleTaskInfo task)
        {
            string          cron   = task.Cron;
            CrontabSchedule result = null;

            try
            {
                if (string.IsNullOrEmpty(cron))
                {
                    throw new Exception($"Aix.ScheduleTask任务{task.Id},{task.TaskName}表达式配置为空");
                }
                if (CrontabScheduleCache.TryGetValue(cron, out result))
                {
                    return(result);
                }
                var options = new CrontabSchedule.ParseOptions
                {
                    IncludingSeconds = cron.Split(' ').Length > 5,
                };
                result = CrontabSchedule.Parse(cron, options);
                CrontabScheduleCache.TryAdd(cron, result);
            }
            catch (Exception ex)
            {
                logger.LogError(ex, $"Aix.ScheduleTask定时任务解析出错 {task.Id},{task.TaskName},{task.Cron}");
            }
            return(result);
        }
コード例 #2
0
        public async Task <int> SaveTask(ScheduleTaskDTO req)
        {
            AssertUtils.IsNotEmpty(req.TaskName, $"{nameof(AixScheduleTaskInfo.TaskName)}为空");
            AssertUtils.IsNotEmpty(req.Cron, $"{nameof(AixScheduleTaskInfo.Cron)}为空");
            AssertUtils.IsNotEmpty(req.TaskContent, $"{nameof(AixScheduleTaskInfo.TaskContent)}为空");
            AssertUtils.IsTrue(req.MaxRetryCount >= 0, $"{nameof(AixScheduleTaskInfo.MaxRetryCount)} 为空");

            var model = await _aixScheduleTaskRepository.GetById(req.TaskId);

            if (model == null)
            {
                model = new AixScheduleTaskInfo
                {
                    TaskGroup       = req.TaskGroup ?? "",
                    TaskStatus      = 1,
                    TaskName        = req.TaskName,
                    TaskDesc        = req.TaskDesc ?? "",
                    Cron            = req.Cron,
                    TaskContent     = req.TaskContent ?? "",
                    LastExecuteTime = 0,
                    NextExecuteTime = 0,
                    MaxRetryCount   = req.MaxRetryCount,
                    CreatorId       = req.UserId ?? "",
                    CreateTime      = DateTime.Now,
                    ModifierId      = req.UserId ?? "",
                    ModifyTime      = DateTime.Now
                };

                var newId = await _aixScheduleTaskRepository.InsertAsync(model);

                model.Id = (int)newId;
            }

            else
            {
                model = new AixScheduleTaskInfo
                {
                    Id        = req.TaskId,
                    TaskGroup = req.TaskGroup ?? "",
                    //TaskStatus = 1,
                    TaskName    = req.TaskName,
                    TaskDesc    = req.TaskDesc ?? "",
                    Cron        = req.Cron,
                    TaskContent = req.TaskContent ?? "",
                    // LastExecuteTime = 0,
                    // NextExecuteTime = 0,
                    MaxRetryCount = req.MaxRetryCount,
                    // CreatorId = req.UserId ?? "",
                    // CreateTime = DateTime.Now,
                    ModifierId = req.UserId ?? "",
                    ModifyTime = DateTime.Now
                };
                await _aixScheduleTaskRepository.UpdateAsync(model);
            }
            return(model.Id);
        }
コード例 #3
0
        private async Task <int> SaveLog(AixScheduleTaskInfo taskInfo)
        {
            AixScheduleTaskLog log = new AixScheduleTaskLog
            {
                ScheduleTaskId = taskInfo.Id,
                RetryCount     = taskInfo.MaxRetryCount,
                TriggerCode    = (int)OPStatus.Init,
                TriggerMessage = "",
                TriggerTime    = DateTime.Now,
                ResultCode     = (int)OPStatus.Init,
                ResultMessage  = "",// StringUtils.SubString(resultDTO.Message, 500),
                AlarmStatus    = (sbyte)AlarmStatus.Init,
                CreateTime     = DateTime.Now,
                ModifyTime     = DateTime.Now
            };
            var newLogId = await _aixScheduleTaskLogRepository.InsertAsync(log);

            return((int)newLogId);
        }
コード例 #4
0
        public Task Trigger(AixScheduleTaskInfo taskInfo, TimeSpan delay)
        {
            if (OnHandleMessage == null)
            {
                return(Task.CompletedTask);
            }
            //把线程队列引用过来,根据id进入不同的线程队列,保证串行执行

            // _logger.LogDebug($"执行定时任务:{taskInfo.Id},{taskInfo.TaskName},{taskInfo.ExecutorParam}");

            _taskExecutor.GetSingleThreadTaskExecutor(taskInfo.Id).Schedule(async(state) =>
            {
                var innerTaskInfo = (AixScheduleTaskInfo)state;
                int logId         = 0;
                try
                {
                    logId = await SaveLog(innerTaskInfo);
                    await OnHandleMessage(new ScheduleTaskContext
                    {
                        LogId       = logId,
                        TaskId      = innerTaskInfo.Id,
                        TaskName    = innerTaskInfo.TaskName,
                        TaskGroup   = innerTaskInfo.TaskGroup,
                        TaskContent = innerTaskInfo.TaskContent
                    });
                    await UpdateTriggerCode(logId, OPStatus.Success, "success");
                }
                catch (OperationCanceledException ex)
                {
                    _logger.LogError(ex, "Aix.ScheduleTask任务取消");
                    await UpdateTriggerCode(logId, OPStatus.Fail, ex.Message);
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex, $"Aix.ScheduleTask定时任务执行出错 {innerTaskInfo.Id},{innerTaskInfo.TaskName},{innerTaskInfo.TaskContent}");
                    await UpdateTriggerCode(logId, OPStatus.Fail, ex.Message);
                }
            }, taskInfo, delay);

            return(Task.CompletedTask);
        }