JobBase.cs 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. using Infrastructure;
  2. using NLog;
  3. using Quartz;
  4. using System;
  5. using System.Diagnostics;
  6. using System.Threading.Tasks;
  7. using ZR.Common;
  8. using ZR.Model.System;
  9. using ZR.Service.System.IService;
  10. namespace ZR.Tasks
  11. {
  12. public class JobBase
  13. {
  14. /// <summary>
  15. /// 日志接口
  16. /// </summary>
  17. private static readonly Logger logger = LogManager.GetCurrentClassLogger();
  18. /// <summary>
  19. /// 执行指定任务
  20. /// </summary>
  21. /// <param name="context">作业上下文</param>
  22. /// <param name="job">业务逻辑方法</param>
  23. public async Task<SysTasksLog> ExecuteJob(IJobExecutionContext context, Func<Task> job)
  24. {
  25. double elapsed = 0;
  26. int status = 0;
  27. string logMsg;
  28. try
  29. {
  30. //var s = context.Trigger.Key.Name;
  31. //记录Job时间
  32. Stopwatch stopwatch = new Stopwatch();
  33. stopwatch.Start();
  34. //执行任务
  35. await job();
  36. stopwatch.Stop();
  37. elapsed = stopwatch.Elapsed.TotalMilliseconds;
  38. logMsg = "success";
  39. }
  40. catch (Exception ex)
  41. {
  42. JobExecutionException e2 = new(ex)
  43. {
  44. //true 是立即重新执行任务
  45. RefireImmediately = true
  46. };
  47. status = 1;
  48. logMsg = $"Job Run Fail,Exception:{ex.Message}";
  49. WxNoticeHelper.SendMsg("任务执行出错", logMsg);
  50. }
  51. var logModel = new SysTasksLog()
  52. {
  53. Elapsed = elapsed,
  54. Status = status.ToString(),
  55. JobMessage = logMsg
  56. };
  57. await RecordTaskLog(context, logModel);
  58. return logModel;
  59. }
  60. /// <summary>
  61. /// 记录到日志
  62. /// </summary>
  63. /// <param name="context"></param>
  64. /// <param name="logModel"></param>
  65. protected async Task RecordTaskLog(IJobExecutionContext context, SysTasksLog logModel)
  66. {
  67. var tasksLogService = (ISysTasksLogService)App.GetRequiredService(typeof(ISysTasksLogService));
  68. var taskQzService = (ISysTasksQzService)App.GetRequiredService(typeof(ISysTasksQzService));
  69. // 可以直接获取 JobDetail 的值
  70. IJobDetail job = context.JobDetail;
  71. logModel.InvokeTarget = job.JobType.FullName;
  72. logModel = await tasksLogService.AddTaskLog(job.Key.Name, logModel);
  73. //成功后执行次数+1
  74. if (logModel.Status == "0")
  75. {
  76. await taskQzService.UpdateAsync(f => new SysTasks()
  77. {
  78. RunTimes = f.RunTimes + 1,
  79. LastRunTime = DateTime.Now
  80. }, f => f.ID == job.Key.Name);
  81. }
  82. logger.Info($"执行任务【{job.Key.Name}|{logModel.JobName}】结果={logModel.JobMessage}");
  83. }
  84. }
  85. }