JobBase.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. using Host.Common;
  2. using Host.Controllers;
  3. using Host.IJobs.Model;
  4. using Host.Model;
  5. using Newtonsoft.Json;
  6. using Quartz;
  7. using Serilog;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Diagnostics;
  11. using System.Threading.Tasks;
  12. namespace Host.IJobs
  13. {
  14. [DisallowConcurrentExecution]
  15. [PersistJobDataAfterExecution]
  16. public abstract class JobBase<T> where T : LogModel, new()
  17. {
  18. protected readonly int maxLogCount = 20;//最多保存日志数量
  19. protected readonly int warnTime = 20;//接口请求超过多少秒记录警告日志
  20. protected Stopwatch stopwatch = new Stopwatch();
  21. protected T LogInfo { get; private set; }
  22. protected MailMessageEnum MailLevel = MailMessageEnum.None;
  23. public JobBase(T logInfo)
  24. {
  25. LogInfo = logInfo;
  26. }
  27. public async Task Execute(IJobExecutionContext context)
  28. {
  29. //如果结束时间超过当前时间,则暂停当前任务。
  30. var endTime = context.JobDetail.JobDataMap.GetString("EndAt");
  31. if (!string.IsNullOrWhiteSpace(endTime) && DateTime.Parse(endTime) <= DateTime.Now)
  32. {
  33. await context.Scheduler.PauseJob(new JobKey(context.JobDetail.Key.Name, context.JobDetail.Key.Group));
  34. return;
  35. }
  36. MailLevel = (MailMessageEnum)int.Parse(context.JobDetail.JobDataMap.GetString(Constant.MAILMESSAGE) ?? "0");
  37. //记录执行次数
  38. var runNumber = context.JobDetail.JobDataMap.GetLong(Constant.RUNNUMBER);
  39. context.JobDetail.JobDataMap[Constant.RUNNUMBER] = ++runNumber;
  40. var logs = context.JobDetail.JobDataMap[Constant.LOGLIST] as List<string> ?? new List<string>();
  41. if (logs.Count >= maxLogCount)
  42. logs.RemoveRange(0, logs.Count - maxLogCount);
  43. stopwatch.Restart(); // 开始监视代码运行时间
  44. try
  45. {
  46. LogInfo.BeginTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  47. LogInfo.JobName = $"{context.JobDetail.Key.Group}.{context.JobDetail.Key.Name}";
  48. await NextExecute(context);
  49. }
  50. catch (Exception ex)
  51. {
  52. LogInfo.ErrorMsg = $"<span class='error'>{ex.Message}</span>";
  53. context.JobDetail.JobDataMap[Constant.EXCEPTION] = $"<div class='err-time'>{LogInfo.BeginTime}</div>{JsonConvert.SerializeObject(LogInfo)}";
  54. await ErrorAsync(LogInfo.JobName, ex, JsonConvert.SerializeObject(LogInfo), MailLevel);
  55. }
  56. finally
  57. {
  58. stopwatch.Stop(); // 停止监视
  59. double seconds = stopwatch.Elapsed.TotalSeconds; //总秒数
  60. LogInfo.EndTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  61. if (seconds >= 1)
  62. LogInfo.ExecuteTime = seconds + "秒";
  63. else
  64. LogInfo.ExecuteTime = stopwatch.Elapsed.TotalMilliseconds + "毫秒";
  65. var classErr = string.IsNullOrWhiteSpace(LogInfo.ErrorMsg) ? "" : "error";
  66. logs.Add($"<p class='msgList {classErr}'><span class='time'>{LogInfo.BeginTime} 至 {LogInfo.EndTime} 【耗时】{LogInfo.ExecuteTime}</span>{JsonConvert.SerializeObject(LogInfo)}</p>");
  67. context.JobDetail.JobDataMap[Constant.LOGLIST] = logs;
  68. if (seconds >= warnTime)//如果请求超过20秒,记录警告日志
  69. {
  70. await WarningAsync(LogInfo.JobName, "耗时过长 - " + JsonConvert.SerializeObject(LogInfo), MailLevel);
  71. }
  72. }
  73. }
  74. public abstract Task NextExecute(IJobExecutionContext context);
  75. public async Task WarningAsync(string title, string msg, MailMessageEnum mailMessage)
  76. {
  77. Log.Logger.Warning(msg);
  78. if (mailMessage == MailMessageEnum.All)
  79. {
  80. await new SetingController().SendMail(new SendMailModel()
  81. {
  82. Title = $"任务调度-{title}【警告】消息",
  83. Content = msg
  84. });
  85. }
  86. }
  87. public async Task InformationAsync(string title, string msg, MailMessageEnum mailMessage)
  88. {
  89. Log.Logger.Information(msg);
  90. if (mailMessage == MailMessageEnum.All)
  91. {
  92. await new SetingController().SendMail(new SendMailModel()
  93. {
  94. Title = $"任务调度-{title}消息",
  95. Content = msg
  96. });
  97. }
  98. }
  99. public async Task ErrorAsync(string title, Exception ex, string msg, MailMessageEnum mailMessage)
  100. {
  101. Log.Logger.Error(ex, msg);
  102. if (mailMessage == MailMessageEnum.Err || mailMessage == MailMessageEnum.All)
  103. {
  104. await new SetingController().SendMail(new SendMailModel()
  105. {
  106. Title = $"任务调度-{title}【异常】消息",
  107. Content = msg
  108. });
  109. }
  110. }
  111. }
  112. }