Quartz_1_简单编程式任务调度使用(SimpleTrigger)

  最近在工做中,要作定时任务的更能,最开始的时候,想到的是 JavaSE 中,自带 Timer 及 TimerTask 联合使用,完成定时任务。最后发现,随着业务的复杂,JDK 中的 Timer 和 TimerTask 并不能简单、灵活的完成定时任务的操做。因而,便学习了任务调度框架-- Quartz。在最初的学习中,网上的例子大多数是基于 quartz-2.0.0 以前的版本,可是发现,2.0.0以前的版本和 2.0.0以后的变化仍是比较大的,网上给出的例子及方法,都不适用了。最后,在学习了 quartz-2.1.7 以后,大体了解了下相关的方法。现分享出来,以供学习。java

  此次大概会写到的东西,以下图:apache

框架

  第一个简单的任务调度实例以下:ide

首先是自定义本身的做业类,而后是开始任务调度操做。具体的使用方法,以下代码:性能

(1)自定义的做业类学习

/** 0.0.0.1 */
 
package com.gaoqing.common.quartz;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

/**
 * 自定义做业类
 * @author 高青
 * 2014-3-23
 */
public class MyJob implements Job{

    /**
     * 2014-3-23
     */
    public MyJob() {
        
    }
    
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        
        //获得当前做业的名称
        String jobName = context.getJobDetail().getJobDataMap().getString("name");
        
        System.out.println(
                "当前做业开始执行了,做业的名称为:" + jobName + 
                ",做业的时间是:" + new SimpleDateFormat("yyyy-MM-dd").format(new Date())
        );
    }

}

做业类中的逻辑就是,取出任务调度器中注册的 JobDetail 的名称。测试

(2)具体的任务调度操做以下:ui

/** 0.0.0.1 */
 
package com.gaoqing.common.quartz;

import java.util.Date;

import org.apache.log4j.Logger;
import org.quartz.JobBuilder;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;

/**
 * 简单任务调度测试类
 * @author 高青
 * 2014-3-20
 */
public class SimpleQuartzTest{
    
    /** 日志对象 */
    private static Logger log = Logger.getLogger(SimpleQuartzTest.class);

    /**
     * 2014-3-20
     */
    public SimpleQuartzTest() {
        
    }

    /**
     * 主线程方法
     * author 高青
     * 2014-3-20
     * @param args 参数字符串集
     * @return void 空
     * @throws SchedulerException 调度器异常
     */
    public static void main(String[] args) throws SchedulerException {
        
        //获得一个默认的调度器
        Scheduler defaultScheduler = StdSchedulerFactory.getDefaultScheduler();
        
        //获得具体的和指定做业相关的 JobDetail 对象
        JobDetail jobDetail = JobBuilder.              //2.0.0以后,JobDetail 变成了接口,不能用以前的 new JobDetail()来实例了,如今要经过相应的做业建造器来管理生成
                                newJob(MyJob.class).
                                withIdentity("myFirstJob", "firstJob").
                                build();              //要调用建造器的 build()方法,才能实例当前做业的具体做业对象
        
        //获得做业的参数对象
        JobDataMap jobDataMap = jobDetail.getJobDataMap();   //能够向做业数据对象中,存放本身须要的数据,在本身实现的 Job 类中,能够经过 context 获得相应的参数,以便作业务处理
        jobDataMap.put("myFirstJob", "first");     
        jobDataMap.put("name", "myFirstJob");     
        
        //实例化触发器对象(定义执行的时间和执行的周期)
        SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger(). //同上,触发器的也须要相应的建造器来实例化触发器,如今的 Trigger 也是接口,不能经过 new Trigger() 来实例化了
                withIdentity(TriggerKey.triggerKey("myFirstTigger", "myFirstGroup")).
                withSchedule(                       //在获得对应的 SimpleTrigger 时,须要经过触发器建造器的 widthSchedule()方法,建造对应的触发器
                        SimpleScheduleBuilder.
                        simpleSchedule().
                        repeatForever().
                        withIntervalInSeconds(5)
                        ).
                        startAt(new Date()).
                        build();
        
        //添加调度做业(将具体的做业和触发器添加到做业中)
        defaultScheduler.scheduleJob(jobDetail, simpleTrigger);

        //执行调度任务
        defaultScheduler.start();
    }
}

  上面就是一个简单的任务调度的实现,和以前的版本相比,变化仍是挺大了,我的感受后面的版本更强调了性能和多任务处理。本文主要旨在实用,并不讲解大量的理论,理论在网上都是能够搜到的。但愿本身的一点点分享,能对他人有一点点的帮助。下一篇,将写一个简单的任务调度实例,使用更能强大的 CronTrigger 触发器来实现任务调度功能。spa

相关文章
相关标签/搜索