使用Scheduler开启,移除,修改任务的工具类:
package com.googosoft.until.schedul3; import java.util.Date; import org.quartz.CronScheduleBuilder; import org.quartz.JobBuilder; import org.quartz.JobDataMap; import org.quartz.JobDetail; import org.quartz.JobKey; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.TriggerKey; import org.quartz.impl.StdSchedulerFactory; /** * * @author songyan * @date 2020年3月31日 下午1:19:25 * @desc 定时任务工具类 */ public class SchedulerUtil { private static Scheduler scheduler = createScheduler(); private SchedulerUtil() {} private static final String jobGroup = "jobGroup"; private static final String triggerGroup = "triggerGroup"; /** * 创建一个触发器 * @param cron * @param triggerKeyName * @param triggerGroup * @param endDate * @return */ private static Trigger createTrigger( String cron, String triggerKeyName, Date endDate) { return TriggerBuilder.newTrigger().withIdentity(triggerKeyName,triggerGroup) .withSchedule(CronScheduleBuilder.cronSchedule(cron) .withMisfireHandlingInstructionDoNothing()).endAt(endDate).build(); } /** * 创建一个调度器 */ private static Scheduler createScheduler() { // 通过schedulerFactory获取一个调度器 SchedulerFactory schedulerfactory = new StdSchedulerFactory(); try { // 通过schedulerFactory获取一个调度器 return schedulerfactory.getScheduler(); } catch (SchedulerException e) { e.printStackTrace(); } return null; } /** * 创建作业 * @param clazz * @param jobName * @param dataMap * @param jobGroup * @return */ @SuppressWarnings("unchecked") private static JobDetail getJob(@SuppressWarnings("rawtypes") Class clazz, String jobName, JobDataMap dataMap) { return JobBuilder.newJob(clazz).setJobData(dataMap).withIdentity(jobName,jobGroup).build(); } /** * 开启一次调度 * @param scheduler * @param jobDetail * @param trigger */ private static void startScheduler(Scheduler scheduler, JobDetail jobDetail, Trigger trigger) { // 把作业和触发器注册到任务调度中 try { scheduler.scheduleJob(jobDetail, trigger); scheduler.start(); } catch (SchedulerException e) { e.printStackTrace(); } } /** * 执行 * @param JobClazz * @param cron * @param endDate * @param dataMap * @param key */ public static void start(@SuppressWarnings("rawtypes") Class JobClazz, String cron, Date endDate, JobDataMap dataMap, String key) { JobDetail job = getJob(JobClazz,key,dataMap); Trigger trigger = createTrigger(cron,key,endDate); startScheduler(scheduler, job, trigger); } /** * 修改表达式 * @param key * @param cron * @param endDate * @throws SchedulerException */ public static void update(String key, String cron, Date endDate) throws SchedulerException { TriggerKey triggerKey = TriggerKey.triggerKey(key, triggerGroup); Trigger newTrigger = createTrigger(cron, key, endDate) ; scheduler.rescheduleJob(triggerKey, newTrigger); } /** * 移除一个作业调度 * @param key */ public static void remove(String key) { try { scheduler.unscheduleJob(TriggerKey.triggerKey(key, triggerGroup)); scheduler.deleteJob(JobKey.jobKey(key, jobGroup)); } catch (SchedulerException e) { e.printStackTrace(); } } }
作业类(可以将作业中的参数通过JobDataMap传递):
package com.googosoft.job; import org.quartz.Job; import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; /** * @author songyan * @date 2020年3月31日 下午1:51:33 * @desc 测试作业 */ public class DemoJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { JobDataMap data = context.getJobDetail().getJobDataMap(); String[] keys = data.getKeys(); System.out.println("************* 参数列表 start **************"); for (int i = 0; i < keys.length; i++) { String key = keys[i]; Object value = data.get(key); System.out.println("key:"+keys[i]+";value:"+value+";"); } System.out.println("************* 参数列表 end **************"); } }
测试:
public static void main(String[] args) throws ParseException, InterruptedException, SchedulerException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date endDate = sdf.parse("2020-04-05 12:00:00"); Date endDate2 = sdf.parse("2020-04-02 14:52:00"); String cron = "0/1 * * * * ? "; String cron2 = "0/2 * * * * ? "; @SuppressWarnings("rawtypes") Class clazz = DemoJob.class; String key =UuidUtil.get32UUID(); JobDataMap dataMap= new JobDataMap(); dataMap.put("name", "11111111111111111111111"); dataMap.put("age", 18); SchedulerUtil.start(clazz,cron,endDate, dataMap,key); SchedulerUtil.update(key,cron,endDate2); SchedulerUtil.remove(key); }
原文:https://www.cnblogs.com/excellencesy/p/12605382.html