首页 > 其他 > 详细

任务调度:Scheduler

时间:2020-03-31 15:33:10      阅读:136      评论:0      收藏:0      [点我收藏+]

使用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);
    }

 

任务调度:Scheduler

原文:https://www.cnblogs.com/excellencesy/p/12605382.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!