QuartzManager 定时器管理

来源:互联网 发布:jsmd5解密算法 编辑:程序博客网 时间:2024/06/10 01:19

主要来源:http://blog.csdn.net/xlxxcc/article/details/52115995

import org.quartz.*;import org.quartz.impl.StdSchedulerFactory;import org.slf4j.Logger;import org.slf4j.LoggerFactory;/** * 定时器管理 * 来源:http://blog.csdn.net/xlxxcc/article/details/52115995 */public class QuartzManager {    private static Logger logger = LoggerFactory.getLogger(QuartzManager.class);    private static SchedulerFactory schedulerFactory = new StdSchedulerFactory();    /**     * @Description: 添加一个定时任务     *     * @param jobName 任务名     * @param jobGroupName  任务组名     * @param triggerName 触发器名     * @param triggerGroupName 触发器组名     * @param jobClass  任务     * @param cron   时间设置,参考quartz说明文档     */    public static void addJob(String jobName, String jobGroupName,                              String triggerName, String triggerGroupName, Class jobClass, String cron) {        try {            Scheduler sched = schedulerFactory.getScheduler();            // 任务名,任务组,任务执行类            JobDetail jobDetail= JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();            // 触发器            TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();            // 触发器名,触发器组            triggerBuilder.withIdentity(triggerName, triggerGroupName);            triggerBuilder.startNow();            // 触发器时间设定            triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));            // 创建Trigger对象            CronTrigger trigger = (CronTrigger) triggerBuilder.build();            // 调度容器设置JobDetail和Trigger            sched.scheduleJob(jobDetail, trigger);            // 启动            if (!sched.isShutdown()) {                sched.start();            }        } catch (Exception e) {            e.printStackTrace();            throw new RuntimeException(e);        }    }    /**     * @Description: 修改一个任务的触发时间     *     * @param triggerName 触发器名     * @param triggerGroupName 触发器组名     * @param cron   时间设置,参考quartz说明文档     */    public static void modifyJobTime(String triggerName, String triggerGroupName, String cron) {        try {            Scheduler sched = schedulerFactory.getScheduler();            TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);            CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey);            if (trigger == null) {                return;            }            String oldTime = trigger.getCronExpression();            if (!oldTime.equalsIgnoreCase(cron)) {                /** 方式一 :调用 rescheduleJob 开始 */                // 触发器                TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();                // 触发器名,触发器组                triggerBuilder.withIdentity(triggerName, triggerGroupName);                triggerBuilder.startNow();                // 触发器时间设定                triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));                // 创建Trigger对象                trigger = (CronTrigger) triggerBuilder.build();                // 方式一 :修改一个任务的触发时间                sched.rescheduleJob(triggerKey, trigger);                /** 方式一 :调用 rescheduleJob 结束 */                /** 方式二:先删除,然后在创建一个新的Job  */                //JobDetail jobDetail = sched.getJobDetail(JobKey.jobKey(jobName, jobGroupName));                //Class<? extends Job> jobClass = jobDetail.getJobClass();                //removeJob(jobName, jobGroupName, triggerName, triggerGroupName);                //addJob(jobName, jobGroupName, triggerName, triggerGroupName, jobClass, cron);                /** 方式二 :先删除,然后在创建一个新的Job */            }        } catch (Exception e) {            throw new RuntimeException(e);        }    }    /**     * @Description: 移除一个任务     *     * @param jobName     * @param jobGroupName     * @param triggerName     * @param triggerGroupName     */    public static void removeJob(String jobName, String jobGroupName,                                 String triggerName, String triggerGroupName) {        try {            Scheduler sched = schedulerFactory.getScheduler();            TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);            sched.pauseTrigger(triggerKey);// 停止触发器            sched.unscheduleJob(triggerKey);// 移除触发器            sched.deleteJob(JobKey.jobKey(jobName, jobGroupName));// 删除任务        } catch (Exception e) {            throw new RuntimeException(e);        }    }    /**     * @Description:启动所有定时任务     */    public static void startJobs() {        try {            Scheduler sched = schedulerFactory.getScheduler();            sched.start();        } catch (Exception e) {            throw new RuntimeException(e);        }    }    /**     * @Description:关闭所有定时任务     */    public static void shutdownJobs() {        try {            Scheduler sched = schedulerFactory.getScheduler();            if (!sched.isShutdown()) {                sched.shutdown();            }        } catch (Exception e) {            throw new RuntimeException(e);        }    }    /**     * 安全关闭     * @throws SchedulerException     */    public static void safeShutdown() throws SchedulerException {        Scheduler scheduler = schedulerFactory.getScheduler();        int executingJobSize = scheduler.getCurrentlyExecutingJobs().size();        logger.info("安全关闭 当前还有" + executingJobSize + "个任务正在执行,等待完成后关闭");        //等待任务执行完后安全关闭        scheduler.shutdown(true);        logger.info("安全关闭 成功");    }