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