package com.ots.project.monitor.job.util; import com.ots.common.constant.Constants; import com.ots.common.constant.ScheduleConstants; import com.ots.common.utils.ExceptionUtil; import com.ots.common.utils.StringUtils; import com.ots.common.utils.bean.BeanUtils; import com.ots.common.utils.spring.SpringUtils; import com.ots.project.monitor.job.domain.Job; import com.ots.project.monitor.job.domain.JobLog; import com.ots.project.monitor.job.service.IJobLogService; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Date; public abstract class AbstractQuartzJob implements org.quartz.Job { private static final Logger log = LoggerFactory.getLogger(AbstractQuartzJob.class); private static ThreadLocal threadLocal = new ThreadLocal<>(); @Override public void execute(JobExecutionContext context) throws JobExecutionException { Job job = new Job(); BeanUtils.copyBeanProp(job, context.getMergedJobDataMap().get(ScheduleConstants.TASK_PROPERTIES)); try { before(context, job); if (job != null) { doExecute(context, job); } after(context, job, null); } catch (Exception e) { log.error("任务执行异常 - :", e); after(context, job, e); } } protected void before(JobExecutionContext context, Job job) { threadLocal.set(new Date()); } protected void after(JobExecutionContext context, Job job, Exception e) { Date startTime = threadLocal.get(); threadLocal.remove(); final JobLog jobLog = new JobLog(); jobLog.setJobName(job.getJobName()); jobLog.setJobGroup(job.getJobGroup()); jobLog.setInvokeTarget(job.getInvokeTarget()); jobLog.setStartTime(startTime); jobLog.setEndTime(new Date()); long runMs = jobLog.getEndTime().getTime() - jobLog.getStartTime().getTime(); jobLog.setJobMessage(jobLog.getJobName() + " 总共耗时:" + runMs + "毫秒"); if (e != null) { jobLog.setStatus(Constants.FAIL); String errorMsg = StringUtils.substring(ExceptionUtil.getExceptionMessage(e), 0, 2000); jobLog.setExceptionInfo(errorMsg); } else { jobLog.setStatus(Constants.SUCCESS); } SpringUtils.getBean(IJobLogService.class).addJobLog(jobLog); } protected abstract void doExecute(JobExecutionContext context, Job job) throws Exception; }