JobBase.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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.ServiceCore.Services;
  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="job">业务逻辑方法</param>
  65. public async Task<SysTasksLog> ExecuteJob(IJobExecutionContext context, Func<Task<string>> job)
  66. {
  67. double elapsed = 0;
  68. int status = 0;
  69. string logMsg;
  70. try
  71. {
  72. //var s = context.Trigger.Key.Name;
  73. //记录Job时间
  74. Stopwatch stopwatch = new Stopwatch();
  75. stopwatch.Start();
  76. //执行任,并返回结果
  77. string result = await job();
  78. stopwatch.Stop();
  79. elapsed = stopwatch.Elapsed.TotalMilliseconds;
  80. logMsg = result.Length <= 2000 ? result : result.Substring(0, 2000);
  81. }
  82. catch (Exception ex)
  83. {
  84. JobExecutionException e2 = new(ex)
  85. {
  86. //true 是立即重新执行任务
  87. RefireImmediately = true
  88. };
  89. status = 1;
  90. logMsg = $"Job Run Fail,Exception:{ex.Message}";
  91. WxNoticeHelper.SendMsg("任务执行出错", logMsg);
  92. }
  93. var logModel = new SysTasksLog()
  94. {
  95. Elapsed = elapsed,
  96. Status = status.ToString(),
  97. JobMessage = logMsg
  98. };
  99. await RecordTaskLog(context, logModel);
  100. return logModel;
  101. }
  102. /// <summary>
  103. /// 记录到日志
  104. /// </summary>
  105. /// <param name="context"></param>
  106. /// <param name="logModel"></param>
  107. protected async Task RecordTaskLog(IJobExecutionContext context, SysTasksLog logModel)
  108. {
  109. var tasksLogService = (ISysTasksLogService)App.GetRequiredService(typeof(ISysTasksLogService));
  110. var taskQzService = (ISysTasksQzService)App.GetRequiredService(typeof(ISysTasksQzService));
  111. // 可以直接获取 JobDetail 的值
  112. IJobDetail job = context.JobDetail;
  113. logModel.InvokeTarget = job.JobType.FullName;
  114. logModel = await tasksLogService.AddTaskLog(job.Key.Name, logModel);
  115. //成功后执行次数+1
  116. if (logModel.Status == "0")
  117. {
  118. await taskQzService.UpdateAsync(f => new SysTasks()
  119. {
  120. RunTimes = f.RunTimes + 1,
  121. LastRunTime = DateTime.Now
  122. }, f => f.ID == job.Key.Name);
  123. }
  124. logger.Info($"执行任务【{job.Key.Name}|{logModel.JobName}】结果={logModel.JobMessage}");
  125. }
  126. }
  127. }