码迷,mamicode.com
首页 > 编程语言 > 详细

quartz任务调度整合springMVC学习二

时间:2016-07-22 14:51:50      阅读:346      评论:0      收藏:0      [点我收藏+]

标签:quartz

    之前写了quartz整合spring的使用的静态调用,但实际工作中可能会需要用到动态的任务调度,不是写死在spring里面,而是可以由管理员配置怎么执行,这里就需要将quartz中trigger 和 job的信息存入数据库持久化,不过在整合springmvc前,我觉得先熟悉quartz的单独使用会更有助于学习,以下以query2.2.2为例,做了一些测试。

 1、首先是创建任务调度工厂:

//创建调度器工厂
SchedulerFactory schedulerFactory=new StdSchedulerFactory();

 2、从调度器工厂中获取调度器

//从调度工厂中获取调度器
Scheduler scheduler=schedulerFactory.getScheduler();

 3、建立工作,两种写法:一种是JobDetailImpl直接实例化一个调用器,参数依次为名称,组,调用方法所在的类(需要实现Job接口),第二种是用JobDetail接口去创建。

//创建一个工作,指向执行的类,这里有必要说明一下,quartz在2.0以后将JobDetail改成了接口,我之前测试的时候直接用JobDetail去建实例一直报错,原因就是用了2.0以后的包
//JobDetailImpl job=new JobDetailImpl("jobName","jobGroup",SimpleJob.class);
JobDetail job=JobBuilder.newJob(SimpleJob.class).withIdentity("jobName","jobGroup").build();
//这样建立的工作只会去调用类里面默认的execute方法,如果想要动态的去调用,可以通过JobDataMap去传一些参数,JobDataMap跟map用法差不多,把想传的参数put进去就行,我在SimpleJob类里面写了一个反射,动态的去调用方法,当然也可以用if else的形式选择去执行那个方法,放射的写法如下:
String str=Job.getJobDetail().getJobDataMap().getString("method");
this.getClass().getMethod(str).invoke(null,null);
//SimpleJob.class.getMethod(str).invoke(null,null);都一样

4、创建触发器,分为简单的触发器和定时的触发器,同样各有两种写法

简单触发器一:
//SimpleTriggerImpl simpleTrigger=new SimpleTriggerImpl("spt");
//simpleTrigger.setStartTime(new Date());
//simpleTrigger.setRepeatInterval(6000);
//simpleTrigger.setRepeatCount(5);
简单触发器二:
Trigger trigger=TriggerBuilder.newTrigger().withIdentity("simpleTrigger", "triggerGroup") .withSchedule(
SimpleScheduleBuilder.repeatSecondlyForever()).startAt(new Date()).build();                    // 执行规则此处为每秒重复永久执行        执行时间(startAt可自定义启动时间)  
定时触发器一:
//CronTriggerImpl cronTriggerImpl=new CronTriggerImpl("crt1");
//cronTriggerImpl.setStartTime(new Date());
//cronTriggerImpl.setCronExpression("0/10 * * * * ? ");
定时触发器二:
Trigger trigger=TriggerBuilder.newTrigger().withIdentity("simpleTrigger", "triggerGroup").withSchedule(
CronScheduleBuilder.cronSchedule("0 42 10 * * ? *")).startNow().build();  
       //执行规则 表达式参照一里面的规则            执行时间(startNow为立即启动)
 //关于这边的执行规则的方法可以网上找一个quartz的说明文档

5、将工作与触发器放入调度器

//有多个工作,可以添加多个进去
scheduler.scheduleJob(job, trigger);
//scheduler.scheduleJob(job2, trigger2);添加工作

//创建key JobKey key=new JobKey("jobName","jobGroup"); 

//scheduler.deleteJob(key);删除任务
//scheduler.pauseJob(key);暂停任务
//开始执行
scheduler.start();

然后在贴上一个写好的util类

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

大致就这些,下次把quartz整合进springMVC在测试一下

quartz任务调度整合springMVC学习二

标签:quartz

原文地址:http://11745766.blog.51cto.com/11735766/1828709

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!