触发器 Trigger: 什么时候工作
任务 Job: 做什么工作
调度器 Scheduler: 搭配 Trigger和Job
1.创建一个job类,用作要定时执行的方法:
package quartz;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
* MailJob 实现了 Job 接口,提供 execute,干具体的活儿
* @author mzj07
*
*/
@DisallowConcurrentExecution
//默认的情况下,无论上一次任务是否结束或者完成,只要规定的时间到了,那么下一次就开始。
//有时候会做长时间的任务,比如数据库备份,这个时候就希望上一次备份成功结束之后,才开始下一次备份,即便是规定时间到了,也不能开始,因为这样很有可能造成 数据库被锁死 (几个线程同时备份数据库,引发无法预计的混乱)。
//那么在这种情况下,给数据库备份任务增加一个注解就好了:
public class PhoneJob implements Job{
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
JobDetail jobDetail = context.getJobDetail();
String phone = jobDetail.getJobDataMap().getString("phone");
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
String now = sdf.format(new Date());
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.printf("给手机号码 %s 打了一次通话, 当前时间是: %s%n" ,phone, now);
}
}
2.创建测试类,用于启动这个定时任务:
package quartz;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.matchers.KeyMatcher;
import org.quartz.JobKey;
public class TestQuartz {
public static void main(String[] args) throws Exception {
jobDataMap();
// databaseCurrentJob();
// exceptionHandle1();
// stop();
}
private static void jobDataMap() throws SchedulerException, InterruptedException {
//创建调度器
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
//定义一个触发器
Trigger trigger = newTrigger().withIdentity("trigger1", "group1")//第一个参数为名称,第二个参数为所属的组
.startNow()
.withSchedule(simpleSchedule()
.withIntervalInSeconds(2)//每隔2s执行一次
.withRepeatCount(10))//总共执行10+1次(第一次)
.build();
Trigger trigger2 = newTrigger().withIdentity("trigger2", "group2")//第一个参数为名称,第二个参数为所属的组
.startNow()
.withSchedule(simpleSchedule()
.withIntervalInSeconds(2)//每隔2s执行一次
.withRepeatCount(10))//总共执行10+1次(第一次)
.build();
//定义一个JobDetail
JobDetail job = newJob(MailJob.class)//指定是MailJob这个类干活,可自定义。
.withIdentity("mailjob1", "mailgroup")//任务名称、分组
.usingJobData("email", "admin@10086.com")//属性
.build();
JobDetail job_two =newJob(PhoneJob.class)
.withIdentity("phonejob1","phonegroup")
.usingJobData("phone", "166****3936")
.build();
//用JobDataMap 修改email
job.getJobDataMap().put("email", "admin@taobao.com");
//增加Job监听
MailJobListener mailJobListener= new MailJobListener();
KeyMatcher<JobKey> keyMatcher = KeyMatcher.keyEquals(job.getKey());
scheduler.getListenerManager().addJobListener(mailJobListener, keyMatcher);
//调度加入这个job
scheduler.scheduleJob(job, trigger);
scheduler.scheduleJob(job_two,trigger2);
//启动
scheduler.start();
//等待20秒,让前面的任务都执行完了之后,再关闭调度器
Thread.sleep(20000);
scheduler.shutdown(true);
}
}