QuartzBiz.java 7.23 KB
package com.cjs.cms.biz.pub;

import java.util.Date;
import java.util.List;

import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.ScheduleBuilder;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.cjs.cms.dao.pub.QuartzTaskConfigDao;
import com.cjs.cms.model.pub.QuartzTaskConfigInfo;

/**
 * quartz定时器工具类
 * @author tongxiaochuan
 *
 */
@Service
public class QuartzBiz {

    @Autowired
    private QuartzTaskConfigDao quartzTaskConfigDao;

    private static SchedulerFactory schedulerFactory   = new StdSchedulerFactory();
    private static final String     JOB_GROUP_NAME     = "QUARTZ_GROUP_NAME_";
    private static final String     TRIGGER_GROUP_NAME = "QUARTZ_TRIGGER_GROUP_NAME_";

    /**添加任务*/
    @SuppressWarnings("unchecked")
    public static void addJob(QuartzTaskConfigInfo taskInfo) {
        try {
            Scheduler sched = schedulerFactory.getScheduler();
            Class cls = Class.forName(taskInfo.getClassName());
            TriggerKey triggerKey = TriggerKey.triggerKey(JOB_GROUP_NAME + taskInfo.getId(),
                TRIGGER_GROUP_NAME + taskInfo.getId());
            Trigger trigger = sched.getTrigger(triggerKey);
            if (trigger == null) {
                JobDetail jobDetail = JobBuilder.newJob(cls)
                    .withIdentity(JOB_GROUP_NAME + taskInfo.getId(),
                        TRIGGER_GROUP_NAME + taskInfo.getId())
                    .build();
                jobDetail.getJobDataMap().put("scheduleJob_" + taskInfo.getId(), taskInfo);
                if (taskInfo.getStartDate() == null) {
                    taskInfo.setStartDate(new Date());
                }
                if ("1".equals(taskInfo.getSchedType())) {
                    trigger = TriggerBuilder.newTrigger()
                        .withIdentity(JOB_GROUP_NAME + taskInfo.getId(),
                            TRIGGER_GROUP_NAME + taskInfo.getId())
                        .startAt(taskInfo.getStartDate())
                        .withSchedule(CronScheduleBuilder.cronSchedule(taskInfo.getCron())).build();
                } else {
                    SimpleScheduleBuilder schedule = SimpleScheduleBuilder.simpleSchedule()
                        .withIntervalInMilliseconds(taskInfo.getIntervalMs());
                    if (taskInfo.getTimes() != null) {
                        schedule = schedule.withRepeatCount(taskInfo.getTimes());
                    }
                    trigger = TriggerBuilder.newTrigger()
                        .withIdentity(JOB_GROUP_NAME + taskInfo.getId(),
                            TRIGGER_GROUP_NAME + taskInfo.getId())
                        .startAt(taskInfo.getStartDate()).withSchedule(schedule).build();
                }
                sched.scheduleJob(jobDetail, trigger);
            } else {
                //trigger已存在,则更新相应的定时设置
                if ("1".equals(taskInfo.getSchedType())) {
                    trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
                        .withSchedule(
                            (ScheduleBuilder) CronScheduleBuilder.cronSchedule(taskInfo.getCron()))
                        .build();
                } else {
                    SimpleScheduleBuilder schedule = SimpleScheduleBuilder.simpleSchedule()
                        .withIntervalInMilliseconds(taskInfo.getIntervalMs());
                    if (taskInfo.getTimes() != null) {
                        schedule = schedule.withRepeatCount(taskInfo.getTimes());
                    }
                    trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
                        .withSchedule((ScheduleBuilder) schedule).build();
                }
                sched.rescheduleJob(triggerKey, trigger);
            }
            if (!sched.isShutdown()) {
                sched.start();
            }
            System.out.println(sched.getTrigger(triggerKey));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 加载数据库表中的任务
     */
    public void initJob() {
        List<QuartzTaskConfigInfo> list = quartzTaskConfigDao.queryTasks();
        for (QuartzTaskConfigInfo taskInfo : list) {
            QuartzBiz.addJob(taskInfo);
        }
    }

    /**暂停任务*/
    public static void pauseJob(QuartzTaskConfigInfo taskInfo) {
        try {
            Scheduler scheduler = schedulerFactory.getScheduler();
            JobKey jobKey = JobKey.jobKey(JOB_GROUP_NAME + taskInfo.getId(),
                TRIGGER_GROUP_NAME + taskInfo.getId());
            scheduler.pauseJob(jobKey);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

    /**恢复任务*/
    public static void resumeJob(QuartzTaskConfigInfo taskInfo) {
        try {
            Scheduler scheduler = schedulerFactory.getScheduler();
            JobKey jobKey = JobKey.jobKey(JOB_GROUP_NAME + taskInfo.getId(),
                TRIGGER_GROUP_NAME + taskInfo.getId());
            scheduler.resumeJob(jobKey);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

    /**删除任务*/
    public static void deleteJob(QuartzTaskConfigInfo taskInfo) {
        try {
            Scheduler scheduler = schedulerFactory.getScheduler();
            JobKey jobKey = JobKey.jobKey(JOB_GROUP_NAME + taskInfo.getId(),
                TRIGGER_GROUP_NAME + taskInfo.getId());
            scheduler.deleteJob(jobKey);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

    /**更新任务*/
    @SuppressWarnings("unchecked")
    public static void reshceduleJob(QuartzTaskConfigInfo taskInfo) {
        try {
            Scheduler scheduler = schedulerFactory.getScheduler();
            TriggerKey triggerKey = TriggerKey.triggerKey(JOB_GROUP_NAME + taskInfo.getId(),
                TRIGGER_GROUP_NAME + taskInfo.getId());
            Trigger trigger = scheduler.getTrigger(triggerKey);
            if ("1".equals(taskInfo.getSchedType())) {
                trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
                    .withSchedule(
                        (ScheduleBuilder) CronScheduleBuilder.cronSchedule(taskInfo.getCron()))
                    .build();
            } else {
                SimpleScheduleBuilder schedule = SimpleScheduleBuilder.simpleSchedule()
                    .withIntervalInMilliseconds(taskInfo.getIntervalMs());
                if (taskInfo.getTimes() != null) {
                    schedule = schedule.withRepeatCount(taskInfo.getTimes());
                }
                trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
                    .withSchedule((ScheduleBuilder) schedule).build();
            }
            scheduler.rescheduleJob(triggerKey, trigger);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
}