123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- using Infrastructure;
- using NLog;
- using Quartz;
- using System;
- using System.Diagnostics;
- using System.Threading.Tasks;
- using ZR.Common;
- using ZR.Model.System;
- using ZR.ServiceCore.Services;
- 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>
- public async Task<SysTasksLog> ExecuteJob(IJobExecutionContext context, Func<Task> 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;
- }
- /// <summary>
- /// 执行指定任务(接收返回结果)
- /// </summary>
- /// <param name="context">作业上下文</param>
- /// <param name="job">业务逻辑方法</param>
- public async Task<SysTasksLog> ExecuteJob(IJobExecutionContext context, Func<Task<string>> job)
- {
- double elapsed = 0;
- int status = 0;
- string logMsg;
- try
- {
- //var s = context.Trigger.Key.Name;
- //记录Job时间
- Stopwatch stopwatch = new Stopwatch();
- stopwatch.Start();
- //执行任,并返回结果
- string result = await job();
- stopwatch.Stop();
- elapsed = stopwatch.Elapsed.TotalMilliseconds;
- logMsg = result.Length <= 2000 ? result : result.Substring(0, 2000);
- }
- 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;
- }
- /// <summary>
- /// 记录到日志
- /// </summary>
- /// <param name="context"></param>
- /// <param name="logModel"></param>
- 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}");
- }
- }
- }
|