public static object ModifyTaskEntity(this TaskOptions taskOptions, ISchedulerFactory schedulerFactory, JobAction action) { TaskOptions options = null; object result = null; switch (action) { case JobAction.除: for (var i = 0; i < _taskList.Count; i++) { options = _taskList[i]; if (options.TaskName == taskOptions.TaskName && options.GroupName == taskOptions.GroupName) { _taskList.RemoveAt(i); } } break; case JobAction.修改: options = _taskList .FirstOrDefault(x => x.TaskName == taskOptions.TaskName && x.GroupName == taskOptions.GroupName); //移除以前的配置 if (options != null) { _taskList.Remove(options); } //生成任务并添加新配置 result = taskOptions.AddJob(schedulerFactory).GetAwaiter().GetResult(); break; case JobAction.暂停: case JobAction.开启: case JobAction.停止: case JobAction.立即执行: options = _taskList .FirstOrDefault(x => x.TaskName == taskOptions.TaskName && x.GroupName == taskOptions.GroupName); if (action == JobAction.暂停) { options.Status = (int)TriggerState.Paused; } else if (action == JobAction.停止) { options.Status = (int)action; } else { options.Status = (int)TriggerState.Normal; } break; } //生成配置文件 FileQuartz.WriteJobConfig(_taskList); FileQuartz.WriteJobAction(action, taskOptions.TaskName, taskOptions.GroupName, "操作对象:" + JsonConvert.SerializeObject(taskOptions)); return(result); }
/// <summary> /// 添加作业 /// </summary> /// <param name="taskOptions"></param> /// <param name="schedulerFactory"></param> /// <param name="init">是否初始化,否=需要重新生成配置文件,是=不重新生成配置文件</param> /// <returns></returns> public static async Task <object> AddJob(this TaskOptions taskOptions, ISchedulerFactory schedulerFactory, bool init = false) { try { //元组用于验证CRON表达式是否正确 (bool, string)validExpression = taskOptions.Interval.IsValidExpression(); if (!validExpression.Item1) { return new { status = false, msg = validExpression.Item2 } } ; //元组用于验证作业是否已经存在 (bool, object)result = taskOptions.Exists(init); if (!result.Item1) { return(result.Item2); } if (!init) { _taskList.Add(taskOptions); FileQuartz.WriteJobConfig(_taskList); } IJobDetail job = JobBuilder.Create <HttpResultful>() .WithIdentity(taskOptions.TaskName, taskOptions.GroupName) .Build(); ITrigger trigger = TriggerBuilder.Create() .WithIdentity(taskOptions.TaskName, taskOptions.GroupName) .StartNow().WithDescription(taskOptions.Describe) .WithCronSchedule(taskOptions.Interval) .Build(); IScheduler scheduler = await schedulerFactory.GetScheduler(); await scheduler.ScheduleJob(job, trigger); if (taskOptions.Status == (int)TriggerState.Normal) { await scheduler.Start(); } else { await schedulerFactory.Pause(taskOptions); //TODO:更新日志 FileQuartz.WriteStartLog($"作业:{taskOptions.TaskName},分组:{taskOptions.GroupName},新建时未启动原因,状态为:{taskOptions.Status}"); } //TODO:更新动作日志 if (!init) { FileQuartz.WriteJobAction(JobAction.新增, taskOptions.TaskName, taskOptions.GroupName); } } catch (Exception ex) { return(new { status = false, msg = ex.Message }); } return(new { status = true }); }
public IActionResult Log(int pageSize = 1) { return(new ContentResult { Content = FileQuartz.GetAccessLog(pageSize), ContentType = "text/html", StatusCode = (int)HttpStatusCode.OK }); }
/// <summary> /// 获取所有的作业 /// </summary> /// <param name="schedulerFactory"></param> /// <returns></returns> public static async Task <List <TaskOptions> > GetJobs(this ISchedulerFactory schedulerFactory) { List <TaskOptions> list = new List <TaskOptions>(); try { IScheduler _scheduler = await schedulerFactory.GetScheduler(); var groups = await _scheduler.GetJobGroupNames(); foreach (var groupName in groups) { foreach (var jobKey in await _scheduler.GetJobKeys(GroupMatcher <JobKey> .GroupEquals(groupName))) { TaskOptions taskOptions = _taskList.Where(x => x.GroupName == jobKey.Group && x.TaskName == jobKey.Name) .FirstOrDefault(); if (taskOptions == null) { continue; } var triggers = await _scheduler.GetTriggersOfJob(jobKey); foreach (ITrigger trigger in triggers) { DateTimeOffset?dateTimeOffset = trigger.GetPreviousFireTimeUtc(); if (dateTimeOffset != null) { taskOptions.LastRunTime = Convert.ToDateTime(dateTimeOffset.ToString()); } else { var runlog = FileQuartz.GetJobRunLog(taskOptions.TaskName, taskOptions.GroupName, 1, 2); if (runlog.Count > 0) { DateTime.TryParse(runlog[0].BeginDate, out DateTime lastRunTime); taskOptions.LastRunTime = lastRunTime; } } } list.Add(taskOptions); } } } catch (Exception ex) { FileQuartz.WriteStartLog("获取作业异常:" + ex.Message + ex.StackTrace); } return(list); }
private void WriteLog() { var request = _accessor.HttpContext.Request; var url = new StringBuilder() .Append(request.Scheme) .Append("://") .Append(request.Host) .Append(request.PathBase) .Append(request.Path) .Append(request.QueryString) .ToString(); FileQuartz.WriteAccess(HttpManager.GetUserIP(_accessor) + "_" + url); }
private IServiceProvider GetServiceProvider() { IServiceCollection services = new ServiceCollection(); services.AddHttpClient(); services.AddCore(); services.AddTransient <JobFactory>(); services.AddTransient <JobService>(); services.AddTransient <JobListener>(); services.AddTransient <BaseJob>(); FileQuartz.CreateQuartzRootPath(); IServiceProvider serviceProvider = services.BuildServiceProvider(); return(serviceProvider); }
/// <summary> /// 初始化作业 /// </summary> /// <param name="applicationBuilder"></param> /// <param name="env"></param> /// <returns></returns> public static IApplicationBuilder UseQuartz(this IApplicationBuilder applicationBuilder, IHostingEnvironment env) { IServiceProvider services = applicationBuilder.ApplicationServices; ISchedulerFactory _schedulerFactory = services.GetService <ISchedulerFactory>(); string path = FileQuartz.CreateQuartzRootPath(env); string jobConfig = FileHelper.ReadFile(path + QuartzFileInfo.JobConfigFileName); if (string.IsNullOrEmpty(jobConfig)) { FileHelper.WriteFile(FileQuartz.LogPath, "start.txt", $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")},没有默认配置任务\r\n", true); return(applicationBuilder); } int errorCount = 0; string errorMsg = ""; TaskOptions options = null; try { //TODO:从数据库获取任务列表 _taskList = JsonConvert.DeserializeObject <List <TaskOptions> >(jobConfig); _taskList.ForEach(x => { options = x; var result = x.AddJob(_schedulerFactory, true).Result; }); } catch (Exception ex) { errorCount = +1; errorMsg += $"作业:{options?.TaskName},异常:{ex.Message}"; } string content = $"成功:{ _taskList.Count - errorCount}个,失败{errorCount}个,异常:{errorMsg}\r\n"; FileQuartz.WriteStartLog(content); return(applicationBuilder); }
/// <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); } }
public Task Execute(IJobExecutionContext context) { DateTime dateTime = DateTime.Now; YuebonCacheHelper yuebonCacheHelper = new YuebonCacheHelper(); SysSetting sysSetting = yuebonCacheHelper.Get("SysSetting").ToJson().ToObject <SysSetting>(); Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); AbstractTrigger trigger = (context as JobExecutionContextImpl).Trigger as AbstractTrigger; string sqlWhere = string.Format("Id='{0}' and GroupName='{1}'", trigger.Name, trigger.Group); TaskManager taskManager = iService.GetWhere(sqlWhere); if (taskManager == null) { FileQuartz.WriteErrorLog($"任务不存在"); return(Task.Delay(1)); } try { string msg = $"开始时间:{dateTime.ToString("yyyy-MM-dd HH:mm:ss ffff")}"; //记录任务执行记录 iService.RecordRun(taskManager.Id, JobAction.开始, true, msg); //初始化任务日志 FileQuartz.InitTaskJobLogPath(taskManager.Id); var jobId = context.MergedJobDataMap.GetString("OpenJob"); //todo:这里可以加入自己的自动任务逻辑 Log4NetHelper.Info(DateTime.Now.ToString() + "执行任务"); stopwatch.Stop(); string content = $"结束时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ffff")} 共耗时{stopwatch.ElapsedMilliseconds} 毫秒\r\n"; iService.RecordRun(taskManager.Id, JobAction.结束, true, content); if ((MsgType)taskManager.SendMail == MsgType.All) { string emailAddress = sysSetting.Email; if (!string.IsNullOrEmpty(taskManager.EmailAddress)) { emailAddress = taskManager.EmailAddress; } List <string> recipients = new List <string>(); recipients = emailAddress.Split(",").ToList(); var mailBodyEntity = new MailBodyEntity() { Body = msg + content + ",请勿回复本邮件", Recipients = recipients, Subject = taskManager.TaskName }; SendMailHelper.SendMail(mailBodyEntity); } } catch (Exception ex) { stopwatch.Stop(); string content = $"结束时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ffff")} 共耗时{stopwatch.ElapsedMilliseconds} 毫秒\r\n"; iService.RecordRun(taskManager.Id, JobAction.结束, false, content + ex.Message); FileQuartz.WriteErrorLog(ex.Message); if ((MsgType)taskManager.SendMail == MsgType.Error || (MsgType)taskManager.SendMail == MsgType.All) { string emailAddress = sysSetting.Email; if (!string.IsNullOrEmpty(taskManager.EmailAddress)) { emailAddress = taskManager.EmailAddress; } List <string> recipients = new List <string>(); recipients = emailAddress.Split(",").ToList(); var mailBodyEntity = new MailBodyEntity() { Body = "处理失败," + ex.Message + ",请勿回复本邮件", Recipients = recipients, Subject = taskManager.TaskName }; SendMailHelper.SendMail(mailBodyEntity); } } return(Task.Delay(1)); }
/// <summary> /// 获取作业运行日志 /// </summary> /// <param name="taskName"></param> /// <param name="groupName"></param> /// <param name="page"></param> /// <returns></returns> public IActionResult GetRunLog(string taskName, string groupName, int page = 1) { return(Json(FileQuartz.GetJobRunLog(taskName, groupName, page))); }
/// <summary> /// 执行远程接口url的定时任务 /// </summary> /// <param name="context"></param> /// <returns></returns> public Task Execute(IJobExecutionContext context) { YuebonCacheHelper yuebonCacheHelper = new YuebonCacheHelper(); SysSetting sysSetting = yuebonCacheHelper.Get("SysSetting").ToJson().ToObject <SysSetting>(); Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); AbstractTrigger trigger = (context as JobExecutionContextImpl).Trigger as AbstractTrigger; string sqlWhere = string.Format("Id='{0}' and GroupName='{1}'", trigger.Name, trigger.Group); TaskManager taskManager = iService.GetWhere(sqlWhere); string httpMessage = ""; if (taskManager == null) { FileQuartz.WriteErrorLog($"任务不存在"); return(Task.Delay(1)); } FileQuartz.InitTaskJobLogPath(taskManager.Id); string msg = $"开始时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ffff")}"; //记录任务执行记录 iService.RecordRun(taskManager.Id, JobAction.开始, true, msg); if (string.IsNullOrEmpty(taskManager.JobCallAddress) || taskManager.JobCallAddress == "/") { FileQuartz.WriteErrorLog($"{ DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ffff")}未配置任务地址,"); iService.RecordRun(taskManager.Id, JobAction.结束, false, "未配置任务地址"); return(Task.Delay(1)); } try { Dictionary <string, string> header = new Dictionary <string, string>(); if (!string.IsNullOrEmpty(taskManager.JobCallParams)) { httpMessage = HttpRequestHelper.HttpPost(taskManager.JobCallAddress, taskManager.JobCallParams, null, header); } else { httpMessage = HttpRequestHelper.HttpGet(taskManager.JobCallAddress); } stopwatch.Stop(); string content = $"结束时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ffff")} 共耗时{stopwatch.ElapsedMilliseconds} 毫秒,消息:{httpMessage??"OK"}\r\n"; iService.RecordRun(taskManager.Id, JobAction.结束, true, content); if ((MsgType)taskManager.SendMail == MsgType.All) { string emailAddress = sysSetting.Email; if (!string.IsNullOrEmpty(taskManager.EmailAddress)) { emailAddress = taskManager.EmailAddress; } List <string> recipients = new List <string>(); recipients = taskManager.EmailAddress.Split(",").ToList(); //recipients.Add(taskManager.EmailAddress); var mailBodyEntity = new MailBodyEntity() { Body = content + "\n\r请勿直接回复本邮件!", Recipients = recipients, Subject = taskManager.TaskName, }; SendMailHelper.SendMail(mailBodyEntity); } } catch (Exception ex) { stopwatch.Stop(); string content = $"结束时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ffff")} 共耗时{stopwatch.ElapsedMilliseconds} 毫秒\r\n"; iService.RecordRun(taskManager.Id, JobAction.结束, false, content + ex.Message); FileQuartz.WriteErrorLog(ex.Message); if ((MsgType)taskManager.SendMail == MsgType.Error || (MsgType)taskManager.SendMail == MsgType.All) { string emailAddress = sysSetting.Email; if (!string.IsNullOrEmpty(taskManager.EmailAddress)) { emailAddress = taskManager.EmailAddress; } List <string> recipients = new List <string>(); recipients = emailAddress.Split(",").ToList(); var mailBodyEntity = new MailBodyEntity() { Body = ex.Message + "\n\r请勿直接回复本邮件!", Recipients = recipients, Subject = taskManager.TaskName, }; SendMailHelper.SendMail(mailBodyEntity); } } return(Task.Delay(1)); }
/// <summary> /// 添加作业 /// </summary> /// <param name="taskOptions"></param> /// <param name="schedulerFactory"></param> /// <param name="init">是否初始化,否=需要重新生成配置文件,是=不重新生成配置文件</param> /// <returns></returns> public static async Task <object> AddJob(this TaskOptions taskOptions, ISchedulerFactory schedulerFactory, bool init = false, IJobFactory jobFactory = null) { try { (bool, string)validExpression = taskOptions.Interval.IsValidExpression(); if (!validExpression.Item1) { return new { status = false, msg = validExpression.Item2 } } ; (bool, object)result = taskOptions.Exists(init); if (!result.Item1) { return(result.Item2); } if (!init) { _taskList.Add(taskOptions); FileQuartz.WriteJobConfig(_taskList); } IJobDetail job = JobBuilder.Create <HttpResultfulJob>() .WithIdentity(taskOptions.TaskName, taskOptions.GroupName) .Build(); ITrigger trigger = TriggerBuilder.Create() .WithIdentity(taskOptions.TaskName, taskOptions.GroupName) .StartNow() .WithDescription(taskOptions.Describe) .WithCronSchedule(taskOptions.Interval) .Build(); IScheduler scheduler = await schedulerFactory.GetScheduler(); if (jobFactory == null) { try { jobFactory = HttpContext.Current.RequestServices.GetService <IJobFactory>(); } catch (Exception ex) { Console.WriteLine($"创建任务[{taskOptions.TaskName}]异常,{ex.Message}"); } } if (jobFactory != null) { scheduler.JobFactory = jobFactory; } await scheduler.ScheduleJob(job, trigger); if (taskOptions.Status == (int)TriggerState.Normal) { await scheduler.Start(); } else { await schedulerFactory.Pause(taskOptions); FileQuartz.WriteStartLog($"作业:{taskOptions.TaskName},分组:{taskOptions.GroupName},新建时未启动原因,状态为:{taskOptions.Status}"); } if (!init) { FileQuartz.WriteJobAction(JobAction.新增, taskOptions.TaskName, taskOptions.GroupName); } } catch (Exception ex) { return(new { status = false, msg = ex.Message }); } return(new { status = true }); }