/// <summary> /// 记录任务运行结果 /// </summary> /// <param name="jobId">任务Id</param> /// <param name="jobAction">任务执行动作</param> /// <param name="blresultTag">任务执行结果表示,true成功,false失败,初始执行为true</param> /// <param name="msg">任务记录描述</param> public void RecordRun(string jobId, JobAction jobAction, bool blresultTag = true, string msg = "") { DateTime addTime = DateTime.Now; TaskManager job = _repository.GetSingle(jobId); if (job == null) { _taskJobsLogService.Insert(new TaskJobsLog { Id = GuidUtils.CreateNo(), CreatorTime = DateTime.Now, TaskId = jobId, TaskName = "", JobAction = jobAction.ToString(), Status = false, Description = $"未能找到定时任务:{jobId}" }); return; } string resultStr = string.Empty, strDesc = string.Empty; if (!blresultTag) { job.ErrorCount++; job.LastErrorTime = addTime; strDesc = $"异常," + msg; } else { strDesc = $"正常," + msg; } if (jobAction == JobAction.开始) { job.RunCount++; job.LastRunTime = addTime; CronExpression cronExpression = new CronExpression(job.Cron); job.NextRunTime = cronExpression.GetNextValidTimeAfter(addTime).ToDateTime(); } _repository.Update(job, jobId); _taskJobsLogService.Insert(new TaskJobsLog { Id = GuidUtils.CreateNo(), CreatorTime = DateTime.Now, TaskId = job.Id, TaskName = job.TaskName, JobAction = jobAction.ToString(), Status = blresultTag, Description = strDesc }); }
public static void WriteJobAction(JobAction jobAction, string taskName, string groupName, string content = null) { content = $"{jobAction.ToString()} -- {DateTime.Now:yyyy-MM-dd HH:mm:ss} --分组:{groupName},作业:{taskName},消息:{content ?? "OK"}\r\n"; FileHelper.WriteFile(LogPath, "action.txt", content, true); }
/// <summary> /// 触发新增、删除、修改、暂停、启用、立即执行事件 /// </summary> /// <param name="schedulerFactory"></param> /// <param name="taskName"></param> /// <param name="groupName"></param> /// <param name="action"></param> /// <param name="taskOptions"></param> /// <returns></returns> public static async Task <object> TriggerAction(this ISchedulerFactory schedulerFactory, string taskName, string groupName, JobAction action, TaskOptions taskOptions = null) { string errorMsg = ""; try { IScheduler scheduler = await schedulerFactory.GetScheduler(); List <JobKey> jobKeys = scheduler.GetJobKeys(GroupMatcher <JobKey> .GroupEquals(groupName)).Result.ToList(); if (jobKeys == null || jobKeys.Count() == 0) { errorMsg = $"未找到分组[{groupName}]"; return(new { status = false, msg = errorMsg }); } JobKey jobKey = jobKeys.Where(s => scheduler.GetTriggersOfJob(s).Result.Any(x => (x as CronTriggerImpl).Name == taskName)).FirstOrDefault(); if (jobKey == null) { errorMsg = $"未找到触发器[{taskName}]"; return(new { status = false, msg = errorMsg }); } var triggers = await scheduler.GetTriggersOfJob(jobKey); ITrigger trigger = triggers?.Where(x => (x as CronTriggerImpl).Name == taskName).FirstOrDefault(); if (trigger == null) { errorMsg = $"未找到触发器[{taskName}]"; return(new { status = false, msg = errorMsg }); } object result = null; switch (action) { case JobAction.除: case JobAction.修改: await scheduler.PauseTrigger(trigger.Key); await scheduler.UnscheduleJob(trigger.Key); // 移除触发器 await scheduler.DeleteJob(trigger.JobKey); result = taskOptions.ModifyTaskEntity(schedulerFactory, action); break; case JobAction.暂停: case JobAction.停止: case JobAction.开启: result = taskOptions.ModifyTaskEntity(schedulerFactory, action); if (action == JobAction.暂停) { await scheduler.PauseTrigger(trigger.Key); } else if (action == JobAction.开启) { await scheduler.ResumeTrigger(trigger.Key); // await scheduler.RescheduleJob(trigger.Key, trigger); } else { await scheduler.Shutdown(); } break; case JobAction.立即执行: await scheduler.TriggerJob(jobKey); break; } return(result ?? new { status = true, msg = $"作业{action.ToString()}成功" }); } catch (Exception ex) { errorMsg = ex.Message; return(new { status = false, msg = ex.Message }); } finally { FileQuartz.WriteJobAction(action, taskName, groupName, errorMsg); } }
/// <summary> /// 触发新增、删除、修改、暂停、启用、立即执行事件 /// </summary> /// <param name="schedulerFactory"></param> /// <param name="taskName"></param> /// <param name="groupName"></param> /// <param name="action"></param> /// <param name="taskOptions"></param> /// <returns></returns> private async Task <AjaxResponse> TriggerAction(string taskName, string groupName, JobAction action, TaskOptions taskOptions = null) { string errorMsg = ""; try { IScheduler scheduler = await _schedulerFactory.GetScheduler(); List <JobKey> jobKeys = scheduler.GetJobKeys(GroupMatcher <JobKey> .GroupEquals(groupName)).Result.ToList(); if (jobKeys == null || jobKeys.Count() == 0) { errorMsg = $"未找到分组[{groupName}]"; return(new AjaxResponse(false, errorMsg)); } JobKey jobKey = jobKeys.Where(s => scheduler.GetTriggersOfJob(s).Result.Any(x => (x as CronTriggerImpl).Name == taskName)).FirstOrDefault(); if (jobKey == null) { errorMsg = $"未找到触发器[{taskName}]"; return(new AjaxResponse(false, errorMsg)); } IReadOnlyCollection <ITrigger> triggers = await scheduler.GetTriggersOfJob(jobKey); ITrigger trigger = triggers?.Where(x => (x as CronTriggerImpl).Name == taskName).FirstOrDefault(); if (trigger == null) { errorMsg = $"未找到触发器[{taskName}]"; return(new AjaxResponse(false, errorMsg)); } AjaxResponse result = null; switch (action) { case JobAction.除: case JobAction.修改: await scheduler.PauseTrigger(trigger.Key); await scheduler.UnscheduleJob(trigger.Key); // 移除触发器 await scheduler.DeleteJob(trigger.JobKey); result = await ModifyTaskEntity(taskOptions, action); break; case JobAction.暂停: case JobAction.停止: case JobAction.开启: result = await ModifyTaskEntity(taskOptions, action); if (action == JobAction.暂停) { await scheduler.PauseTrigger(trigger.Key); } else if (action == JobAction.开启) { await scheduler.ResumeTrigger(trigger.Key); } else { await scheduler.Shutdown(); } break; case JobAction.立即执行: await scheduler.TriggerJob(jobKey); break; } return(new AjaxResponse(true, $"作业{action.ToString()}成功")); } catch (Exception ex) { _logger.LogError($"{groupName}--{taskName},的{action}错误", ex); errorMsg = ex.Message; return(new AjaxResponse(false, ex.Message)); } }
public static void WriteJobAction(JobAction jobAction, string taskName, string groupName, string content = null) { //TODO:向数据库写入作业执行状态 content = $"{jobAction.ToString()} -- {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} --分组:{groupName},作业:{taskName},消息:{content ?? "OK"}\r\n"; FileHelper.WriteFile(FileQuartz.LogPath, "action.txt", content, true); }