spring quartz動態實現對任務的增刪改查(可傳引數)
阿新 • • 發佈:2019-01-29
上一篇文章寫到了關於定時任務的動態實現,在一些情況下,我們可能需要傳引數來實現定時任務,直接貼程式碼了
QuartzParamUtils,核心類
package com.thinkgem.jeesite.modules.task.quartz.param; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import org.quartz.CronScheduleBuilder; import org.quartz.CronTrigger; import org.quartz.JobDataMap; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.TriggerBuilder; import org.quartz.TriggerKey; import org.springframework.scheduling.quartz.JobDetailFactoryBean; import com.thinkgem.jeesite.common.utils.SpringContextHolder; import com.thinkgem.jeesite.modules.img.dao.GrabPictureDao; import com.thinkgem.jeesite.modules.img.entity.GrabPicture; import com.thinkgem.jeesite.modules.task.quartz.QuartzJobFactory; import com.thinkgem.jeesite.modules.task.quartz.uils.QuartzUtils; public class QuartzParamUtils { private static Logger logger = Logger.getLogger(QuartzJobFactory.class); private static GrabPictureDao grabPictureDao = SpringContextHolder.getBean(GrabPictureDao.class); /** * @Note : 掃面數據庫,檢視是否有計劃任務的變動 */ public static void arrageScheduleJob() { try { List<GrabPicture> jobList = grabPictureDao.findList(new GrabPicture()); if (jobList.size() != 0) { for (GrabPicture job : jobList) { // Keys are composed of both a name and group, and the name must be unique within the group TriggerKey triggerKey = TriggerKey.triggerKey(job.getName(), job.getJobGroup()); // 獲取trigger CronTrigger trigger = (CronTrigger) QuartzUtils.scheduler.getTrigger(triggerKey); // 不存在,建立一個 if (null == trigger) { createSheduler(QuartzUtils.scheduler, job); } else {// Trigger已存在,那麼更新相應的定時設定 updateScheduler(QuartzUtils.scheduler, job, triggerKey, trigger); } } } } catch (Exception e) { e.printStackTrace(); } } /** * 更新相應的定時設定 根據job_status做相應的處理 * * @param scheduler * @param job * @param triggerKey * @param trigger * @throws SchedulerException */ private static void updateScheduler(Scheduler scheduler, GrabPicture job, TriggerKey triggerKey, CronTrigger trigger) throws SchedulerException { if (job.getStatus().equals("1")) {// 0禁用 1啟用 if (!trigger.getCronExpression().equalsIgnoreCase(job.getCron())) { // 表示式排程構建器 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCron()); // 按新的cronExpression表示式重新構建trigger trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); // 按新的trigger重新設定job執行 scheduler.rescheduleJob(triggerKey, trigger); logger.info(job.getJobGroup() + "." + job.getName() + " 更新完畢,目前cron表示式為:" + job.getCron()); } } else if (job.getStatus().equals("0")) { scheduler.pauseTrigger(triggerKey);// 停止觸發器 scheduler.unscheduleJob(triggerKey);// 移除觸發器 scheduler.deleteJob(trigger.getJobKey());// 刪除任務 logger.info(job.getJobGroup() + "." + job.getName() + "刪除完畢"); } } /** * 建立一個定時任務,並做安排 * * @param scheduler * @param job * @throws SchedulerException * @throws Exception */ public static void createSheduler(Scheduler scheduler, GrabPicture job) throws Exception { // 在工作狀態可用時,即job_status = 1 ,開始建立 if (job.getStatus().equals("1")) { // 新建一個基於Spring的管理Job類 JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean(); jobDetailFactoryBean.setName(job.getName()); //jobDetailFactoryBean.setJobClass(job.getClazz().getClass()); jobDetailFactoryBean.setJobClass(MyJobClass.class); JobDataMap jobDataMap = new JobDataMap(); jobDataMap.put("scheduleJob", job); jobDetailFactoryBean.setJobDataMap(jobDataMap); Map<String,String> jobDataAsMap = new HashMap<>(); jobDataAsMap.put("targetObject","test"); //作業物件 jobDataAsMap.put("targetMethod","method"); //作業方法 jobDataAsMap.put("arguments","args"); //作業方法的引數 jobDetailFactoryBean.setJobDataAsMap(jobDataAsMap); jobDetailFactoryBean.afterPropertiesSet(); JobDetail jobDetail = jobDetailFactoryBean.getObject(); //獲取JobDetail物件 //String cronExpression = createCronExpression(targetTime);//建立cron表示式 // 表示式排程構建器 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCron()); // 根據cronExpression表示式構建一個新的trigger CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(job.getName(),job.getJobGroup()) .withSchedule(scheduleBuilder).build(); // 注入到管理類 scheduler.scheduleJob(jobDetail, trigger); } } /** * 更新相應的定時設定 根據job_status做相應的處理 * * @param scheduler * @param job * @param triggerKey * @param trigger * @throws SchedulerException */ public static void updateScheduler(GrabPicture job) throws Exception { Scheduler scheduler = QuartzUtils.scheduler; TriggerKey triggerKey = TriggerKey.triggerKey(job.getName(), job.getJobGroup()); // 獲取trigger CronTrigger trigger = (CronTrigger) QuartzUtils.scheduler.getTrigger(triggerKey); // 不存在,建立一個 if (null == trigger) { createSheduler(scheduler, job); return; } if (job.getStatus().equals("1")) {// 0禁用 1啟用 if (!trigger.getCronExpression().equalsIgnoreCase(job.getCron())) { // 表示式排程構建器 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCron()); // 按新的cronExpression表示式重新構建trigger trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); // 按新的trigger重新設定job執行 scheduler.rescheduleJob(triggerKey, trigger); logger.info(job.getJobGroup() + "." + job.getName() + " 更新完畢,目前cron表示式為:" + job.getCron()); } } else if (job.getStatus().equals("0")) { scheduler.pauseTrigger(triggerKey);// 停止觸發器 scheduler.unscheduleJob(triggerKey);// 移除觸發器 scheduler.deleteJob(trigger.getJobKey());// 刪除任務 logger.info(job.getJobGroup() + "." + job.getName() + "刪除完畢"); } } /** * 更新相應的定時設定 根據job_status做相應的處理 * * @param scheduler * @param job * @param triggerKey * @param trigger * @throws SchedulerException */ public static void deleteScheduler(GrabPicture job) throws Exception { Scheduler scheduler = QuartzUtils.scheduler; TriggerKey triggerKey = TriggerKey.triggerKey(job.getName(), job.getJobGroup()); // 獲取trigger CronTrigger trigger = (CronTrigger) QuartzUtils.scheduler.getTrigger(triggerKey); // 不存在,建立一個 if (null == trigger) { return; } scheduler.pauseTrigger(triggerKey);// 停止觸發器 scheduler.unscheduleJob(triggerKey);// 移除觸發器 scheduler.deleteJob(trigger.getJobKey());// 刪除任務 logger.info(job.getJobGroup() + "." + job.getName() + "刪除完畢"); } }
執行定時任務的類MyJobClass
package com.thinkgem.jeesite.modules.task.quartz.param; import java.lang.reflect.Method; import org.apache.log4j.Logger; import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.context.ApplicationContext; import org.springframework.scheduling.quartz.QuartzJobBean; import com.thinkgem.jeesite.modules.img.entity.GrabPicture; /** * 帶參的JobClass * Created by xiaoming on 2017/5/4. */ public class MyJobClass extends QuartzJobBean { private static Logger logger = Logger.getLogger(MyJobClass.class); private String targetObject; //執行job的物件 private String targetMethod; //執行job的方法 private Object arguments; //執行job的方法引數(如果方法不帶參可以刪除此引數) private ApplicationContext ctx;//ApplicationContext @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { try { JobDataMap jobDataMap = context.getMergedJobDataMap(); GrabPicture scheduleJob = (GrabPicture)jobDataMap.get("scheduleJob"); System.out.println(scheduleJob.getCron()); System.out.println(context.getMergedJobDataMap()); System.out.println("測試"); System.out.println("targetObject:" + targetObject); System.out.println("targetMethod:" + targetMethod); System.out.println("arguments:" + arguments); } catch (Exception e) { logger.error(e); } } //以下是注入方法 public void setApplicationContext(ApplicationContext applicationContext) { this.ctx = applicationContext; } public void setTargetObject(String targetObject) { this.targetObject = targetObject; } public void setTargetMethod(String targetMethod) { this.targetMethod = targetMethod; } public void setArguments(Object arguments) { this.arguments = arguments; } }