一、核心概念
- Job 表示一个工作,要执行的具体内容。此接口中只有一个方法
void execute(JobExecutionContext context)
- JobDetail 表示一个具体的可执行的调度程序,Job 是这个可执行程调度程序所要执行的内容,另外 JobDetail 还包含了这个任务调度的方案和策略。
- Trigger 代表一个调度参数的配置,什么时候去调。
- Scheduler 代表一个调度容器,一个调度容器中可以注册多个 JobDetail 和 Trigger。当 Trigger 与 JobDetail 组合,就可以被 Scheduler 容器调度了。
二、使用
- 使用SchedulerFactory实例化
- 状态:启动(start)、暂停(stand-by)、停止(shutdown)。注意:scheduler被停止后,除非重新实例化,否则不能重新启动;只有当scheduler启动后,即使处于暂停状态也不行,trigger才会被触发(job才会被执行)。
SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
Scheduler sched = schedFact.getScheduler();
sched.start();
// define the job and tie it to our HelloJob class
JobDetail job = newJob(HelloJob.class)
.withIdentity("myJob", "group1")
.build();
// Trigger the job to run now, and then every 40 seconds
Trigger trigger = newTrigger()
.withIdentity("myTrigger", "group1")
.startNow()
.withSchedule(simpleSchedule()
.withIntervalInSeconds(40)
.repeatForever())
.build();
// Tell quartz to schedule the job using our trigger
sched.scheduleJob(job, trigger);
3.写了一个通用的Quartz工具类:
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
public class QuartzUtil {
//log4j
public static void handleSimpleTrigger(String jobName, String jobGroupName,
String triggerName, String triggerGroupName, Class jobClass,
int time) {
// 通过schedulerFactory获取一个调度器
SchedulerFactory schedulerfactory = new StdSchedulerFactory();
Scheduler scheduler = null;
try {
// 通过schedulerFactory获取一个调度器
scheduler = schedulerfactory.getScheduler();
// 创建jobDetail实例,绑定Job实现类
// 指明job的名称,所在组的名称,以及绑定job类
JobDetail job = JobBuilder.newJob(jobClass)
.withIdentity(jobName, jobGroupName).build();
// 定义调度触发规则
//使用simpleTrigger规则
Trigger trigger=TriggerBuilder.newTrigger().withIdentity(triggerName,
triggerGroupName)
.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(time)).startNow().build();//在后面还可以接着跟定时,写在build前下面
// 把作业和触发器注册到任务调度中
scheduler.scheduleJob(job, trigger);
// 启动调度
scheduler.start();
} catch (Exception e) {
System.out.println("错了拉");
}
}
}
方法:.withSchedule(CronScheduleBuilder.cronSchedule(“time”))
关于time格式,这里推荐在线生成Cron表达式的工具:http://cron.qqe2.com/ 来生成自己想要的表达式。
4.使用方法:要重复启动的类implements Job类,示例:
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class App2 implements Job {
/*
*
* */
public static void main(String[] args) {
try {
QuartzUtil.handleSimpleTrigger("44033", "3333", "44033", "3333", App.class, 240);
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("重复执行的任务");
}
}