完全由Java编写的开源作业调度框架,整合了许多额外功能,但是其使用很简单。Quzrtz采用多线程的架构,启动时初始化一些worker线程,用来执行调度的作业。同时使用一套松耦合的线程管理。
定时任务可以推广到:linux定时,windows定时等。在Java中也有很多定时器,JDK自带的定时,Spring封装的定时器等。
Quartz的核心是调度器,负责运行应用环境,同时依赖框架内的一些重要的组件。
线程池管理中,Quartz里的每个对象都是可配置,即定制。
当一个作业被调度、没有调度、或者停止调度时可以通过设置通知通知监听器。
Quartz框架中包含了调度器监听、作业、触发器监听。可以配置作业和触发器监听为全局监听或者特定作业的和触发器的监听。
Corn表达式:
字段名 允许的值 允许的特殊字符
秒 0-59 , – * /
分 0-59 , – * /
时 0-23 , – * /
日 1-31 , – * / L W C
月 1-12 or JAN-DEC , – * /
周 1-7 or SUN-SAT , – * ? / L C # MON FRI
年(可选字段) empty, 1970-2099 , – * /
1. *字符代表:代表所有可能的值。因此,“*”在Month中表示每个月,在Day-of-Month中表示每天,在Hours表
示每小时
2. “,”字符:指定数个值。例如:在Minutes子表达式中,“5,20”表示在5分钟和20分钟触发。
3. “-”字符:指定一个值的范围
4. “/”字符:指定一个值的增加幅度。n/m表示从n开始,每次增加m。例如:在Minutes子表达式中,“0/15”表示
从0分钟开始,每15分钟执行一次。"3/20"表示从第三分钟开始,每20分钟执行一次。和"3,23,43"(表示第3,
23,43分钟触发)的含义一样。
5. “L”字符:用在日表示一个月中的最后一天,用在周表示该月最后一个星期X
6. “W”字符:指定离给定日期最近的工作日(周一到周五)
7. “#”字符:表示该月第几个周X。6#3表示该月第3个周五
8. ? 字符:用在Day-of-Month和Day-of-Week中,指“没有具体的值”。当两个子表达式其中一个被指定了值以后,
为了避免冲突,需要将另外一个的值设为“?”。例如:想在每月20日触发调度,不管20号是星期几,只能用如下
写法:0 0 0 20 * ?,其中最后以为只能用“?”,而不能用“*”。
9. C:该字符只在日期和星期字段中使用,代表“Calendar”的意思。它的意思是计划所关联的日期,如果日期没有
被关联,则相当于日历中所有日期。例如5C在日期字段中就相当于日历5日以后的第一天。1C在星期字段中相
当于星期日后的第一天。
Cron表达式对特殊字符的大小写不敏感,对代表星期的缩写英文大小写也不敏感
Quartz常用corn表达式,网站有在线表达式生成。可直接搜索corn生成。
pom导入:
定义任务内容:
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.util.Date;
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws
JobExecutionException {
//通过打印时间可以看到定时效果
System.out.println(new Date());
}
}
构建任务调度:
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;
/**
* Create by GuoJF on 2019/2/15
*/
public class MyScheduler {
public static void main(String[] args) throws Exception {
//获取调度器
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
//包装任务内容
JobDetail job = newJob(MyJob.class).withIdentity("job1", "group1").build();
//定义触发器
Trigger trigger = newTrigger().withIdentity("TRIGGER1",
"GROUP1").startNow().withSchedule(simpleSchedule().withIntervalInSeconds(3).repeatForever()
).build();
//组装任务
scheduler.scheduleJob(job, trigger);
//启动调度器 开始调度
scheduler.start();
}
}
Job:
实现此接口的execute方法,即是任务方法的实现。
JobEexcutionContext 类提供了调度应用的一些信息。Job运行时的信息保存在
JobDataMap实例中。
JobDetail:
定义任务数据。sheduler每次执行都会创建一个Job实例。
Trigger:
触发JOb执行的时间规则的类,主要有SimpleTrigger和CornTrigger两个类。
SimpleTrigger适合调度一次或者固定时间间隔调度。
CornTrigger则支持Corn表达式执行复杂的时间调度。
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.util.Date;
public class MyJob implements Job{
public void execute(JobExecutionContext jobExecutionContext) throws
JobExecutionException {
//使用Date打印时间方便
System.out.println(new Date());
}
}
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class QuartzTest {
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext = new
ClassPathXmlApplicationContext("spring.xml");
}
}