quartz系列(二):动态定时任务管理

来源:互联网 发布:惠州淘宝培训班 编辑:程序博客网 时间:2024/05/07 01:06

quartz系列(二):动态定时任务管理

在此篇文章中,探讨一下对quartz任务的动态管理。基本思路是创建两张表分别存放Job、Trigger相关信息,项目启动时加载所有任务,在页面可查看状态、以及进行任务管理操作。功能如下图所示:

作业是由作业名称、作业组来唯一确定的,共同组成JobKey、TriggerKey;在创建定时作业时,先行构建任务和触发器,继而在调度器中生成作业,对其进行监控管理。

主要功能类JobUtil.java:

public class JobUtil {    private final static Logger logger = LogManager.getLogger();    /**     * 获取JobKey     * @param job     * @return     */    public static JobKey getJobKey(QuartzJob job){        return JobKey.jobKey(job.getJobName(), job.getJobGroup());    }    /**     * 获取TriggerKey     * @param job     * @return     */    public static TriggerKey getTriggerKey(QuartzJob job){        return TriggerKey.triggerKey(job.getJobName(), job.getJobGroup());    }    /**     * 获取CronTrigger     * @param scheduler     * @param job     * @return     */    public static CronTrigger getCronTrigger(Scheduler scheduler, QuartzJob job){        try {            TriggerKey triggerKey = getTriggerKey(job);            return (CronTrigger) scheduler.getTrigger(triggerKey);        } catch (SchedulerException e) {            logger.error(e);        }        return null;    }    /**     * 新增Job     * @param scheduler     * @param job     * @throws ClassNotFoundException     */    public static void insertJob(Scheduler scheduler, QuartzJob quartzJob) throws ClassNotFoundException{        String jobName = quartzJob.getJobName();        String jogGroup = quartzJob.getJobGroup();        String cronExpression = quartzJob.getCronExpression();        Class _class = Class.forName(quartzJob.getJobClassName());        //构建任务        JobDetail jobDetail = JobBuilder.newJob(_class).withIdentity(jobName, jogGroup).build();        //放入参数,在运行时获取        jobDetail.getJobDataMap().put(Cast.job_params, quartzJob);        //构建调度表达式        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);        //构建trigger        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(jobName, jogGroup)                .withSchedule(cronScheduleBuilder).build();        try {            //构建job            scheduler.scheduleJob(jobDetail, cronTrigger);        } catch (SchedulerException e) {            //日志记录            logger.error(e);        }    }    /**     * 运行一次     * @param scheduler     * @param job     * @throws SchedulerException     */    public static void runJob(Scheduler scheduler, QuartzJob job) throws SchedulerException{        JobKey jobKey = getJobKey(job);        scheduler.triggerJob(jobKey);    }    /**     * 更新定时任务     * @param scheduler     * @param job     */    public static void updateJob(Scheduler scheduler, QuartzJob job){        try {            TriggerKey triggerKey = getTriggerKey(job);            String cronExpression = job.getCronExpression();            //构建调度表达式            CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);            CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);            //重新构建trigger            cronTrigger = cronTrigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();            scheduler.rescheduleJob(triggerKey, cronTrigger);        } catch (SchedulerException e) {            logger.error(e);        }    }    /**     * 删除任务     * @param scheduler     * @param job     */    public static void deleteJob(Scheduler scheduler, QuartzJob job){        try {            JobKey jobKey = getJobKey(job);            scheduler.deleteJob(jobKey);        } catch (SchedulerException e) {            logger.error(e);        }    }    /**     * 暂停任务     * @param scheduler     * @param job     */    public static void pauseJob(Scheduler scheduler, QuartzJob job){        try {            JobKey jobKey = getJobKey(job);            scheduler.pauseJob(jobKey);        } catch (SchedulerException e) {            logger.error(e);        }    }}

初始化类InitQuartzServlet.java:

public class InitQuartzServlet {    private final static Logger logger = LogManager.getLogger();    @Resource    private IQuartzJobDao quartzJobDao;    @Resource    private Scheduler scheduler;    /**     * 项目启动时,初始化Job     */    public void init(){        try {            List<QuartzJob> list = quartzJobDao.selJob(new QuartzJob());            for(QuartzJob quartzJob : list){                CronTrigger cronTrigger = JobUtil.getCronTrigger(scheduler, quartzJob);                if(Util.isEmpty(cronTrigger)){                    JobUtil.insertJob(scheduler, quartzJob);                }else{                    JobUtil.updateJob(scheduler, quartzJob);                }            }        } catch (Exception e) {            logger.error(e);        }    }}

在配置文件spring-mvc-config.xml增加以下配置即可:

< bean id = "InitQuartzServlet" lazy-init = "false" class = "io.hexin.quartz.InitQuartzServlet" init-method = "init" />

spring-quartz.xml文件,只需要配置jobFactory :

<bean id= "schedulerFactoryBean" class ="org.springframework.scheduling.quartz.SchedulerFactoryBean" >   <property name= "jobFactory">     <bean class ="io.hexin.quartz.JobFactory" ></ bean>   </property></bean >

JobFactory.java:

public class JobFactory extends SpringBeanJobFactory{    @Resource    private AutowireCapableBeanFactory beanFactory;    public JobFactory(){    }    @Override    protected Object createJobInstance(TriggerFiredBundle bundle)            throws Exception {        Object jobInstance = super.createJobInstance(bundle);        beanFactory.autowireBean(jobInstance);        return jobInstance;    }}

测试类TestJob.java:

public class TestJob extends BaseJob implements Job{    @Override    public void execute(JobExecutionContext context) throws JobExecutionException {       //执行内容       System. out .println(new Date());       //更新最后执行时间       super .updateLastExecuteTime(context);    }}

(全文完)


我的微博:http://weibo.com/ahmumu

0 0
原创粉丝点击