package com.iailab.module.data.job.utils; import com.iailab.framework.common.constant.Constant; import com.iailab.framework.common.exception.ExceptionUtils; import com.iailab.framework.common.util.spring.SpringContextUtils; import com.iailab.framework.tenant.core.context.TenantContextHolder; import com.iailab.module.data.job.entity.ScheduleJobEntity; import com.iailab.module.data.job.entity.ScheduleJobLogEntity; import com.iailab.module.data.job.service.ScheduleJobLogService; import org.quartz.DisallowConcurrentExecution; import org.quartz.JobExecutionContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.quartz.QuartzJobBean; import java.lang.reflect.Method; import java.util.Date; /** * 定时任务 * * @author Mark sunlightcs@gmail.com */ @DisallowConcurrentExecution public class ScheduleJob extends QuartzJobBean { private Logger logger = LoggerFactory.getLogger(getClass()); @Override protected void executeInternal(JobExecutionContext context) { ScheduleJobEntity scheduleJob = (ScheduleJobEntity) context.getMergedJobDataMap(). get(ScheduleUtils.JOB_PARAM_KEY); //设置当前租户 TenantContextHolder.setTenantId(scheduleJob.getTenantId()); Long tenantId = TenantContextHolder.getRequiredTenantId(); //数据库保存执行记录 ScheduleJobLogEntity log = new ScheduleJobLogEntity(); log.setId(System.currentTimeMillis()); log.setJobId(scheduleJob.getId()); log.setBeanName(scheduleJob.getBeanName()); log.setParams(scheduleJob.getParams()); log.setCreateDate(new Date()); log.setTenantId(tenantId); //任务开始时间 long startTime = System.currentTimeMillis(); try { //执行任务 logger.info("任务准备执行,任务ID:{}", scheduleJob.getId()); Object target = SpringContextUtils.getBean(scheduleJob.getBeanName()); Method method = target.getClass().getDeclaredMethod("run", String.class); method.invoke(target, scheduleJob.getParams()); //任务执行总时长 long times = System.currentTimeMillis() - startTime; log.setTimes((int)times); //任务状态 log.setStatus(Constant.SUCCESS); logger.info("任务执行完毕,任务ID:{} 总共耗时:{} 毫秒", scheduleJob.getId(), times); } catch (Exception e) { logger.error("任务执行失败,任务ID:{}", scheduleJob.getId(), e); //任务执行总时长 long times = System.currentTimeMillis() - startTime; log.setTimes((int)times); //任务状态 log.setStatus(Constant.FAIL); log.setError(ExceptionUtils.getErrorStackTrace(e)); }finally { //获取spring bean ScheduleJobLogService scheduleJobLogService = SpringContextUtils.getBean(ScheduleJobLogService.class); //scheduleJobLogService.insert(log); } } }