package com.saye.hospitalgd.scheduler; import java.util.HashMap; import java.util.List; import com.saye.hospitalgd.commons.string.StringDUtil; import org.quartz.CronScheduleBuilder; import org.quartz.CronTrigger; import org.quartz.Job; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.JobKey; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.TriggerBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.quartz.SchedulerFactoryBean; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import com.saye.hospitalgd.model.BaseQuartzConfigEntity; import com.saye.hospitalgd.service.quartz.BaseQuartzConfigService; /** * 调度工厂类 */ @Service("MySchedulerFactory") @Component public class MySchedulerFactory { private static Logger logger = LoggerFactory.getLogger(MySchedulerFactory.class); @Autowired SchedulerFactoryBean schedulerFactoryBean; /** * 任务配置读取服务 */ @Autowired private BaseQuartzConfigService baseQuartzConfigService; public void scheduleJobs() throws SchedulerException { Scheduler scheduler = getScheduler(); // 为了避免org.quartz.ObjectAlreadyExistsException,在执行前将scheduler进行清理 scheduler.clear(); startJob(scheduler); } /** * 获取scheduler * @return * @author * @date 2018年12月27日 */ public Scheduler getScheduler() { return schedulerFactoryBean.getScheduler(); } /** * 项目启动 开启任务 * @param scheduler * @author * @date 2018年12月27日 */ private void startJob(Scheduler scheduler) { try { List jobList = baseQuartzConfigService.findAll(new HashMap()); for (BaseQuartzConfigEntity config : jobList) { try { // 0-暂停的任务 1-正常运行任务 if ("0".equals(config.getStatus())) { continue; } String classz = config.getQuartzClass(); if (StringDUtil.isNotBlank(classz)) { @SuppressWarnings("unchecked") Class clazz = (Class) Class.forName(classz); JobDetail jobDetail = JobBuilder.newJob(clazz).withIdentity(config.getConfigId(), config.getQuartzGroup()) .usingJobData("id", config.getConfigId()).usingJobData("name", config.getQuartzName()).build(); CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(config.getExpression()); CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(config.getConfigId(), config.getQuartzGroup()) .withSchedule(scheduleBuilder).build(); scheduler.scheduleJob(jobDetail, cronTrigger); } } catch (Exception e) { logger.info("定时启动异常:" + config.getQuartzName() + " 异常信息:" + e.getMessage()); } } } catch (Exception e) { e.printStackTrace(); } } /** * 任务暂停(就是删了) * @param id * @throws Exception * @author * @date 2018年12月27日 */ public void pauseJob(String id) throws Exception { Scheduler scheduler = getScheduler(); BaseQuartzConfigEntity QuartzConfig = baseQuartzConfigService.get(String.valueOf(id)); JobKey jobKey = JobKey.jobKey(QuartzConfig.getConfigId(), QuartzConfig.getQuartzGroup()); scheduler.deleteJob(jobKey); } /** * 任务恢复 * @param id * @throws Exception * @author * @date 2018年12月27日 */ public void resumeJob(String id) throws Exception { Scheduler scheduler = getScheduler(); BaseQuartzConfigEntity QuartzConfig = baseQuartzConfigService.get(String.valueOf(id)); JobKey jobKey = JobKey.jobKey(QuartzConfig.getConfigId(), QuartzConfig.getQuartzGroup()); Class clazz = (Class) Class.forName(QuartzConfig.getQuartzClass()); JobDetail jobDetail1 = scheduler.getJobDetail(jobKey); if (jobDetail1 == null) { JobDetail jobDetail = JobBuilder.newJob(clazz).withIdentity(QuartzConfig.getConfigId(), QuartzConfig.getQuartzGroup()) .usingJobData("id", QuartzConfig.getConfigId()).usingJobData("name", QuartzConfig.getQuartzName()).build(); CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(QuartzConfig.getExpression()); CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(QuartzConfig.getConfigId(), QuartzConfig.getQuartzGroup()) .withSchedule(scheduleBuilder).build(); scheduler.scheduleJob(jobDetail, cronTrigger); } else { scheduler.resumeJob(jobKey); } } /** * 添加新的定时任务 * @param id * @param name * @param group * @param cron * @param classz * @throws Exception */ public void addJob(String id,String name, String group,String cron, String classz) throws Exception{ Scheduler scheduler = schedulerFactoryBean.getScheduler(); try { if (StringDUtil.isNotBlank(classz)) { @SuppressWarnings("unchecked") Class clazz = (Class) Class.forName(classz); JobDetail jobDetail = JobBuilder.newJob(clazz).withIdentity(id, group) .usingJobData("id", id).usingJobData("name", name).build(); CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron); CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(id, group) .withSchedule(scheduleBuilder).build(); scheduler.scheduleJob(jobDetail, cronTrigger); } } catch (Exception e) { logger.info("添加定时任务失败:" + " 异常信息:" + e.getMessage()); } } }