上一篇简单的实现了定时作业的开始和结束,今天来用简单的Quartz的触发器来实现调度器全部的基本功能
1、首先创建一个需要定时执行的方法
package com.htwl.waste_api.Test;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import java.util.Date;
/**
* @author jiahailin
* @Description:
*/
public class HelloJob implements Job {
public HelloJob(){
}
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
JobKey jobKey = jobExecutionContext.getJobDetail().getKey();
System.out.println("SimpleJob says: " + jobKey + " executing at " + new Date());
}
}
2、开始操作
package com.htwl.waste_api.Test;
import jdk.nashorn.internal.scripts.JO;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import java.util.Date;
/**
* @author jiahailin
* @Description:
*/
public class FirstTest {
public void run() throws SchedulerException {
//第一步还是获取scheduler的引用
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler();
//jobs可以在sched.start()之前来安排
//获取一个比现在时间大一点的整数时间(这里设置为15秒后)
Date startTime = DateBuilder.nextGivenSecondDate(null,15);
//job1只会在这个时间运行一次
JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("job1","group1").build();
SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("trigger1","group1").startAt(startTime).build();
//调度运行
Date ft = sched.scheduleJob(job,trigger);
System.out.println(job.getKey() + " will run at: " + ft + " and repeat: " + trigger.getRepeatCount() + " times, every "
+ trigger.getRepeatInterval() / 1000 + " seconds");
//job2只会在这个时间运行一次
job = JobBuilder.newJob(HelloJob.class).withIdentity("job2","group1").build();
trigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("trigger2","group1").startAt(startTime).build();
ft = sched.scheduleJob(job,trigger);
System.out.println(job.getKey() + " will run at: " + ft + " and repeat: " + trigger.getRepeatCount() + " times, every "
+ trigger.getRepeatInterval() / 1000 + " seconds");
//job3会运行11次(运行一次,重复10次)
//job3每10秒重复一次
job = JobBuilder.newJob(HelloJob.class).withIdentity("job3","group1").build();
trigger = TriggerBuilder.newTrigger().withIdentity("trigger3","group1").startAt(startTime).
withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).withRepeatCount(10)).build();
ft = sched.scheduleJob(job,trigger);
System.out.println(job.getKey() + " will run at: " + ft + " and repeat: " + trigger.getRepeatCount() + " times, every "
+ trigger.getRepeatInterval() / 1000 + " seconds");
//相同的job(job3)会被另一个触发器(trigger)来调度(scheduler)
//这次会重复两次,间隔10秒
trigger = TriggerBuilder.newTrigger().withIdentity("trigger3","group2").startAt(startTime).
withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).withRepeatCount(2)).forJob(job).build();
ft = sched.scheduleJob(trigger);
System.out.println(job.getKey() + " will [also] run at: " + ft + " and repeat: " + trigger.getRepeatCount()
+ " times, every " + trigger.getRepeatInterval() / 1000 + " seconds");
//job4会运行6次(运行1次,重复5次)
//job4每10秒重复一次
job = JobBuilder.newJob(HelloJob.class).withIdentity("job4","group1").build();
trigger = TriggerBuilder.newTrigger().withIdentity("trigger4","group1").startAt(startTime).
withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).withRepeatCount(5)).build();
ft = sched.scheduleJob(job,trigger);
System.out.println(job.getKey() + " will run at: " + ft + " and repeat: " + trigger.getRepeatCount() + " times, every "
+ trigger.getRepeatInterval() / 1000 + " seconds");
//job5会在5分钟后运行一次
job = JobBuilder.newJob(HelloJob.class).withIdentity("job5","group1").build();
trigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("tirgger5","group1").
startAt(DateBuilder.futureDate(5, DateBuilder.IntervalUnit.MINUTE)).build();
ft = sched.scheduleJob(job,trigger);
System.out.println(job.getKey() + " will run at: " + ft + " and repeat: " + trigger.getRepeatCount() + " times, every "
+ trigger.getRepeatInterval() / 1000 + " seconds");
//job6会每40秒运行一次,无限期的运行下去
job = JobBuilder.newJob(HelloJob.class).withIdentity("job6","group1").build();
trigger = TriggerBuilder.newTrigger().withIdentity("trigger6","group1").
withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(40).repeatForever()).build();
ft = sched.scheduleJob(job,trigger);
System.out.println(job.getKey() + " will run at: " + ft + " and repeat: " + trigger.getRepeatCount() + " times, every "
+ trigger.getRepeatInterval() / 1000 + " seconds");
System.out.println("------- Starting Scheduler ----------------");
//全部的job添加到了scheduler里,但是job在scheduler启动之前是不会执行的
sched.start();
System.out.println("------- Started Scheduler -----------------");
//jobs也可以在sched.start()之后来安排
//job7会每1分钟运行一次,重复1次
job = JobBuilder.newJob(HelloJob.class).withIdentity("job7","group1").build();
trigger = TriggerBuilder.newTrigger().withIdentity("tirgger7","group1").startAt(startTime).
withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInMinutes(1).withRepeatCount(1)).build();
ft = sched.scheduleJob(job,trigger);
System.out.println(job.getKey() + " will run at: " + ft + " and repeat: " + trigger.getRepeatCount() + " times, every "
+ trigger.getRepeatInterval() / 1000 + " seconds");
//job可以立即启动,而不是等待trigger(调度器)
job = JobBuilder.newJob(HelloJob.class).withIdentity("job8","group1").storeDurably().build();
sched.addJob(job,true);
System.out.println("'Manually' triggering job8...(手动调度job8)");
sched.triggerJob(JobKey.jobKey("job8","group1"));
//让他睡30秒,以便让程序执行完
try {
Thread.sleep(30L*1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
//job也可以重新调度
//job7会重新启动
System.out.println("------- Rescheduling... --------------------");
trigger = TriggerBuilder.newTrigger().withIdentity("tirgger7","group1").startAt(startTime).
withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInMinutes(1).withRepeatCount(20)).build();
ft = sched.rescheduleJob(trigger.getKey(),trigger);
System.out.println("job7 rescheduled to run at: " + ft);
//让他睡5分钟,以便让程序执行完
try {
Thread.sleep(300L*1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("准备结束");
sched.shutdown();
System.out.println("已结束");
//显示一些刚刚scheduler的统计信息
SchedulerMetaData schedulerMetaData = sched.getMetaData();
System.out.println("Executed " + schedulerMetaData.getNumberOfJobsExecuted() + " jobs.");
}
public static void main(String[] args) throws SchedulerException {
FirstTest ft = new FirstTest();
ft.run();
}
}