using Newtonsoft.Json; using Quartz; using Serilog; using System; using System.Collections.Generic; using System.Diagnostics; using System.Text; using System.Threading.Tasks; using Utility.Entity; namespace Utility.Job { [DisallowConcurrentExecution] [PersistJobDataAfterExecution] public abstract class JobBase where T : LogModel, new() { protected readonly int maxLogCount = 20;//最多保存日志数量 protected readonly int warnTime = 20;//接口请求超过多少秒记录警告日志 protected Stopwatch stopwatch = new Stopwatch(); protected T LogInfo { get; private set; } private ILogger _logger; public JobBase(T logInfo,ILogger logger) { LogInfo = logInfo; _logger = logger; } public async Task Execute(IJobExecutionContext context) { //如果结束时间超过当前时间,则暂停当前任务。 var endTime = context.JobDetail.JobDataMap.GetString("EndAt"); if (!string.IsNullOrWhiteSpace(endTime) && DateTime.Parse(endTime) <= DateTime.Now) { await context.Scheduler.PauseJob(new JobKey(context.JobDetail.Key.Name, context.JobDetail.Key.Group)); return; } //记录执行次数 var runNumber = context.JobDetail.JobDataMap.GetLong(Constant.RUNNUMBER); context.JobDetail.JobDataMap[Constant.RUNNUMBER] = ++runNumber; var logs = context.JobDetail.JobDataMap[Constant.LOGLIST] as List ?? new List(); if (logs.Count >= maxLogCount) logs.RemoveRange(0, logs.Count - maxLogCount); stopwatch.Restart(); // 开始监视代码运行时间 try { LogInfo.BeginTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); LogInfo.JobName = $"{context.JobDetail.Key.Group}.{context.JobDetail.Key.Name}"; await NextExecute(context); } catch (Exception ex) { LogInfo.ErrorMsg = $"{ex.Message}"; context.JobDetail.JobDataMap[Constant.EXCEPTION] = $"
{LogInfo.BeginTime}
{JsonConvert.SerializeObject(LogInfo)}"; } finally { stopwatch.Stop(); // 停止监视 double seconds = stopwatch.Elapsed.TotalSeconds; //总秒数 LogInfo.EndTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); if (seconds >= 1) LogInfo.ExecuteTime = seconds + "秒"; else LogInfo.ExecuteTime = stopwatch.Elapsed.TotalMilliseconds + "毫秒"; var classErr = string.IsNullOrWhiteSpace(LogInfo.ErrorMsg) ? "" : "error"; logs.Add($"

{LogInfo.BeginTime} 至 {LogInfo.EndTime} 【耗时】{LogInfo.ExecuteTime}{JsonConvert.SerializeObject(LogInfo)}

"); context.JobDetail.JobDataMap[Constant.LOGLIST] = logs; } } public abstract Task NextExecute(IJobExecutionContext context); public async Task WarningAsync(string title, string msg) { _logger.Warning(msg); } public async Task InformationAsync(string title, string msg) { _logger.Information(msg); } public async Task ErrorAsync(string title, Exception ex, string msg) { _logger.Error(ex, msg); } } }