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); }
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); }
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); }
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); }