Quartz框架 实现任务调度

Posted 董泽文

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Quartz框架 实现任务调度相关的知识,希望对你有一定的参考价值。

1.任务

Job:是一个接口,只有一个方法void execute(JobExecutionContext context),开发者实现该接口定义运行任务,JobExecutionContext类提供了调度上下文的各种信息。Job运行时的信息保存在 JobDataMap实例中;

2.触发器

Trigger:是一个类,描述触发Job执行的时间触发规则。主要有SimpleTrigger和 CronTrigger这两个子类。当仅需触发一次或者以固定时间间隔周期执行,SimpleTrigger是最适合的选择;而CronTrigger则 可以通过Cron表达式定义出各种复杂时间规则的调度方案:如每早晨9:00执行,周一、周三、周五下午5:00执行等;

3.调度器

JobDetail:Quartz在每次执行Job时,都重新创建一个Job实例,所以它不直接接受一个Job的实例,相反它接收一个Job实现类,以便运行时通过newInstance()的反射机制实例化Job。因此需要通过一个类来描述Job的实现类及其它相关的静态信息,如Job名字、描述、关联监听器等信息,JobDetail承担了这一角色。

创建一个Quartz工作

1.计划实体类

/**
*
*计划实体类
*/

public class Plan {
    private String date;
    private String task;
    public Plan(String date, String task) {
        
        this.date = date;
        this.task = task;
    }
    public Plan() {
        
    }
    @Override
    public String toString() {
        return "Plan [date=" + date + ", task=" + task + "]";
    }
    public String getDate() {
        return date;
    }
    public void setDate(String date) {
        this.date = date;
    }
    public String getTask() {
        return task;
    }
    public void setTask(String task) {
        this.task = task;
    }
}

2.提醒服务类

/**
 * 
 * @提醒服务类
 *
 */
public class RemindService {
    //数据查询
    public List<Plan> getPlansForToday(){
        List<Plan> list=new ArrayList<Plan>();
        Plan p1=new Plan("2016-11-3","呵呵");
        Plan p2=new Plan("2016-11-4","嘿嘿");
        list.add(p1);
        list.add(p2);
        return list;
        
    }
    //提醒服务类
    public void ouputPlan(){
        List<Plan> forToday = getPlansForToday();
        for (Plan plan : forToday) {
            System.out.println("计划时间"+plan.getDate()+"计划内容"+plan.getTask());
        }
    }
}

3.提醒任务类

/**
 * 
 * @提醒任务类
 *
 */
public class RemindJob implements Job {
    private RemindService service=new RemindService();
    
    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        service.getPlansForToday();
        
    }
    public RemindService getService() {
        return service;
    }
    public void setService(RemindService service) {
        this.service = service;
    }
}

4.调度定时器任务

public class TestJob {
    public static void doRemind() throws SchedulerException, InterruptedException{
        //创建一个任务
        JobDetail job =JobBuilder.newJob(RemindJob.class).withIdentity("job1", "group1").build();
        //创建一个触发器
        
        /*Trigger trigger = TriggerBuilder.newTrigger() 
                .withIdentity(TriggerKey.triggerKey("myTrigger", "myTriggerGroup"))
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                    .withIntervalInMilliseconds(2))
                .startAt(new Date(System.currentTimeMillis()+2000))
                .build();*/
        Trigger trigger=TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1").
                withSchedule(CronScheduleBuilder.cronSchedule("0 34 16 ? * 5#1 2016")).build();
        SchedulerFactory s=new StdSchedulerFactory();
        Scheduler scheduler = s.getScheduler();
        //注册并进行调度
        scheduler.scheduleJob(job,trigger);
        //启动调度
        scheduler.start();
        //睡眠10s
        //Thread.sleep(10000);
        //关闭调度
        //scheduler.shutdown();
    }
        public static void main(String[] args) throws SchedulerException, InterruptedException {
            doRemind();
        }
}

Cron表达式

 

以上是关于Quartz框架 实现任务调度的主要内容,如果未能解决你的问题,请参考以下文章

Quartz 任务调度框架整合Spring使用

Spring Quartz实现任务调度

Spring Quartz实现任务调度

Spring Quartz实现任务调度

优化技术专题「温故而知新」基于Quartz系列的任务调度框架的动态化任务实现分析

分布式定时任务调度框架 - Quartz学习及实战记录笔记