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<T> 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; }
|
|
public JobBase(T logInfo)
|
{
|
LogInfo = logInfo;
|
}
|
|
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;
|
}
|
//记录执行次数
|
long runNumber = 0;
|
try
|
{
|
runNumber = context.JobDetail.JobDataMap.GetLong(Constant.RUNNUMBER);
|
}
|
catch (Exception)
|
{
|
|
}
|
context.JobDetail.JobDataMap[Constant.RUNNUMBER] = ++runNumber;
|
|
var logs = context.JobDetail.JobDataMap[Constant.LOGLIST] as List<string> ?? new List<string>();
|
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 = $"<span class='error'>{ex.Message}</span>";
|
context.JobDetail.JobDataMap[Constant.EXCEPTION] = $"<div class='err-time'>{LogInfo.BeginTime}</div>{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($"<p class='msgList {classErr}'><span class='time'>{LogInfo.BeginTime} 至 {LogInfo.EndTime} 【耗时】{LogInfo.ExecuteTime}</span>{JsonConvert.SerializeObject(LogInfo)}</p>");
|
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);
|
//}
|
}
|
}
|