AbstractQuartzJob.java 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package com.ruoyi.job.util;
  2. import java.util.Date;
  3. import org.quartz.Job;
  4. import org.quartz.JobExecutionContext;
  5. import org.quartz.JobExecutionException;
  6. import org.slf4j.Logger;
  7. import org.slf4j.LoggerFactory;
  8. import com.ruoyi.common.core.constant.ScheduleConstants;
  9. import com.ruoyi.common.core.utils.ExceptionUtil;
  10. import com.ruoyi.common.core.utils.SpringUtils;
  11. import com.ruoyi.common.core.utils.StringUtils;
  12. import com.ruoyi.common.core.utils.bean.BeanUtils;
  13. import com.ruoyi.job.domain.SysJob;
  14. import com.ruoyi.job.domain.SysJobLog;
  15. import com.ruoyi.job.service.ISysJobLogService;
  16. /**
  17. * 抽象quartz调用
  18. *
  19. * @author ruoyi
  20. */
  21. public abstract class AbstractQuartzJob implements Job
  22. {
  23. private static final Logger log = LoggerFactory.getLogger(AbstractQuartzJob.class);
  24. /**
  25. * 线程本地变量
  26. */
  27. private static ThreadLocal<Date> threadLocal = new ThreadLocal<>();
  28. @Override
  29. public void execute(JobExecutionContext context) throws JobExecutionException
  30. {
  31. SysJob sysJob = new SysJob();
  32. BeanUtils.copyBeanProp(sysJob, context.getMergedJobDataMap().get(ScheduleConstants.TASK_PROPERTIES));
  33. try
  34. {
  35. before(context, sysJob);
  36. if (sysJob != null)
  37. {
  38. doExecute(context, sysJob);
  39. }
  40. after(context, sysJob, null);
  41. }
  42. catch (Exception e)
  43. {
  44. log.error("任务执行异常 - :", e);
  45. after(context, sysJob, e);
  46. }
  47. }
  48. /**
  49. * 执行前
  50. *
  51. * @param context 工作执行上下文对象
  52. * @param sysJob 系统计划任务
  53. */
  54. protected void before(JobExecutionContext context, SysJob sysJob)
  55. {
  56. threadLocal.set(new Date());
  57. }
  58. /**
  59. * 执行后
  60. *
  61. * @param context 工作执行上下文对象
  62. * @param sysJob 系统计划任务
  63. */
  64. protected void after(JobExecutionContext context, SysJob sysJob, Exception e)
  65. {
  66. Date startTime = threadLocal.get();
  67. threadLocal.remove();
  68. final SysJobLog sysJobLog = new SysJobLog();
  69. sysJobLog.setJobName(sysJob.getJobName());
  70. sysJobLog.setJobGroup(sysJob.getJobGroup());
  71. sysJobLog.setInvokeTarget(sysJob.getInvokeTarget());
  72. sysJobLog.setStartTime(startTime);
  73. sysJobLog.setStopTime(new Date());
  74. long runMs = sysJobLog.getStopTime().getTime() - sysJobLog.getStartTime().getTime();
  75. sysJobLog.setJobMessage(sysJobLog.getJobName() + " 总共耗时:" + runMs + "毫秒");
  76. if (e != null)
  77. {
  78. sysJobLog.setStatus("1");
  79. String errorMsg = StringUtils.substring(ExceptionUtil.getExceptionMessage(e), 0, 2000);
  80. sysJobLog.setExceptionInfo(errorMsg);
  81. }
  82. else
  83. {
  84. sysJobLog.setStatus("0");
  85. }
  86. // 写入数据库当中
  87. SpringUtils.getBean(ISysJobLogService.class).addJobLog(sysJobLog);
  88. }
  89. /**
  90. * 执行方法,由子类重载
  91. *
  92. * @param context 工作执行上下文对象
  93. * @param sysJob 系统计划任务
  94. * @throws Exception 执行过程中的异常
  95. */
  96. protected abstract void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception;
  97. }