quartz笔记

Posted m.z

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了quartz笔记相关的知识,希望对你有一定的参考价值。

首先网络上的很多教程经常有错(信息过载了),其主要原因是版本发生了变化,例如quartz1和2之间还是有不少差别的,导致查找资料的人浪费了不少时间。所以无论教程如何写,都建议读者首先学习官网的教程,如果有一些资料官网没有,例如扩展的东西或者和其他框架整合的东西,再去参考其他资料。

本文仅为我个人学习记录。建议重点参考官网:www.quartz-scheduler.org

quartz版本:2.2.1

 

原生quartz:

基本思路:

  通过工厂创建一个Scheduler

  创建一个实现Job接口的实现类(就是要具体做的事情,可以具体调用自己写的service)

  定义一个Job,并绑定我们自己实现Job接口的实现类(例如通过JobBuilder的方式)

  创建Trigger,并设置相关参数,如启动时间等。

  将job和trigger绑定到scheduler对象上,并启动

简易案例:

import java.io.File;
import java.io.IOException;

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

public class HelloWorld implements Job {
    public void execute(JobExecutionContext context)
        throws JobExecutionException {

        File file2 = new File("*****/test/HelloJob1.java");
        if (file2.exists()) {  
            System.out.println("存在文件夹或者文件");  
        } else {  
            try {  
                file2.createNewFile(); 
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
        
    }
    
}
//注意以下几个导入很重要
import
static org.quartz.DateBuilder.evenMinuteDate; import static org.quartz.JobBuilder.newJob; import static org.quartz.TriggerBuilder.newTrigger; import java.util.Date; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerFactory; import org.quartz.Trigger; import org.quartz.impl.StdSchedulerFactory; public class TestQuartz { public static void main(String[] args) throws Exception { // First we must get a reference to a scheduler SchedulerFactory sf = new StdSchedulerFactory(); Scheduler sched = sf.getScheduler(); // computer a time that is on the next round minute Date runTime = evenMinuteDate(new Date()); // define the job and tie it to our HelloJob class JobDetail job = newJob(HelloWorld.class).withIdentity("job1", "group1").build(); // Trigger the job to run on the next round minute Trigger trigger = newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build(); // Tell quartz to schedule the job using our trigger sched.scheduleJob(job, trigger); // Start up the scheduler (nothing can actually run until the // scheduler has been started) sched.start(); // wait long enough so that the scheduler as an opportunity to // run the job! try { Thread.sleep(600); // executing... } catch (Exception e) { // } } }

OK,一个简单的应用就搞定了

 

其他关键点(我们可以参考下自己手机上闹钟都有哪些设置)

设定开始和结束时间:

quartz提供了一个DataBuilder类,该类中有很多的方法,例如nextGivenSecondDate(Date date, int secondBase),基本通过这个方法可以定义到日历中的任何时间点

具体还有哪些方法,可以通过API查看:http://www.quartz-scheduler.org/api/2.2.1/index.html

再通过如下方法设置startAt和endAt,基本上就能实现开始和结束时间

Trigger trigger = newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build();这里的runTime我们可以定义为指定时间

Trigger trigger = newTrigger().withIdentity("trigger1", "group1").endAt(runTime).build();

 

设定重复次数

SimpleScheduleBuilder类中有一个静态方法simpleSchedule(),通过它创建SimpleScheduleBuilder对象,该对象可以设置重复次数和重复时间点,具体可以看API,以下是举例

import static org.quartz.SimpleScheduleBuilder.*;

trigger = newTrigger().withIdentity("trigger2", "group1").startAt(runTime).withSchedule(simpleSchedule().withIntervalInSeconds(10).withRepeatCount(10)).build();//每十秒重复一次,重复10次,总计执行11次

 

还有一些其他案例,例如:

trigger = newTrigger().withIdentity("trigger6", "group1").startAt(startTime)
.withSchedule(simpleSchedule().withIntervalInSeconds(40).repeatForever()).build();//每40秒重复一次,一直重复下去,设定86400秒不就是每天固定时间执行一次了吗?

 

其实可选择的方案特别多,包括在某个时间段触发、每个月某日固定时间触发等等,官网上的example基本都有对应的方案,我就不在此穷举了,官网全量包中有,如下是2.2.3的下载地址:http://d2zwv9pap9ylyd.cloudfront.net/quartz-2.2.3-distribution.tar.gz

 

 

 

spring和quartz整合

建议参考:http://blog.csdn.net/defonds/article/details/49496895

以上是关于quartz笔记的主要内容,如果未能解决你的问题,请参考以下文章

quartz学习笔记

quartz学习笔记

Quartz.NET笔记 概述

Quartz.NET笔记 CronTrigger

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

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