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}");
}
}
}