using Infrastructure; using NLog; using Quartz; using System; using System.Diagnostics; using System.Threading.Tasks; using ZR.Common; using ZR.Model.System; using ZR.Service.System.IService; namespace ZR.Tasks { public class JobBase { /// /// 日志接口 /// private static readonly Logger logger = LogManager.GetCurrentClassLogger(); /// /// 执行指定任务 /// /// 作业上下文 /// 业务逻辑方法 public async Task ExecuteJob(IJobExecutionContext context, Func job) { double elapsed = 0; int status = 0; string logMsg; try { //var s = context.Trigger.Key.Name; //记录Job时间 Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); //执行任务 await job(); stopwatch.Stop(); elapsed = stopwatch.Elapsed.TotalMilliseconds; logMsg = "success"; } catch (Exception ex) { JobExecutionException e2 = new(ex) { //true 是立即重新执行任务 RefireImmediately = true }; status = 1; logMsg = $"Job Run Fail,Exception:{ex.Message}"; WxNoticeHelper.SendMsg("任务执行出错", logMsg); } var logModel = new SysTasksLog() { Elapsed = elapsed, Status = status.ToString(), JobMessage = logMsg }; await RecordTaskLog(context, logModel); return logModel; } /// /// 记录到日志 /// /// /// protected async Task RecordTaskLog(IJobExecutionContext context, SysTasksLog logModel) { var tasksLogService = (ISysTasksLogService)App.GetRequiredService(typeof(ISysTasksLogService)); var taskQzService = (ISysTasksQzService)App.GetRequiredService(typeof(ISysTasksQzService)); // 可以直接获取 JobDetail 的值 IJobDetail job = context.JobDetail; logModel.InvokeTarget = job.JobType.FullName; logModel = await tasksLogService.AddTaskLog(job.Key.Name, logModel); //成功后执行次数+1 if (logModel.Status == "0") { await taskQzService.UpdateAsync(f => new SysTasks() { RunTimes = f.RunTimes + 1, LastRunTime = DateTime.Now }, f => f.ID == job.Key.Name); } logger.Info($"执行任务【{job.Key.Name}|{logModel.JobName}】结果={logModel.JobMessage}"); } } }