一. SimpleScheduleBuilder
SimpleScheduleBuilder,简单调度建造者,用于生成调度时间, 接下来,老蝴蝶重点讲解一下,它的用法。
关于它的接口方法,可以观看第二章节的内容。
一.一 调度方法演示
一.一.一 编写 Job 任务
//用于测试 SimpleScheduleBuilder public class MyJob8 implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { //要做的事,是打印当前的时间 SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //格式化时间 String dateString=sdf.format(new Date()); System.out.println("备份数据库的时间是:"+dateString); } }
一.一.二 立即启动,调度方法演示
一.一.二.一 repeatSecondlyForever() 方法
// SimpleScheduleBuilder 方法展示 public class SchedulerDemo8 { public static void main(String[] args) throws Exception{ //获取Scheduler Scheduler scheduler= StdSchedulerFactory.getDefaultScheduler(); // 创建 JobDetail JobDetail jobDetail=JobBuilder.newJob(MyJob8.class) .withIdentity("job1","group1") .build(); //创建 Trigger Trigger trigger= TriggerBuilder.newTrigger() .withIdentity("trigger1","group1") //设置标识 .startNow() //每秒钟执行一次 .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever()) .build(); //关联 job和 trigger scheduler.scheduleJob(jobDetail,trigger); //启动 scheduler scheduler.start(); } }
运行程序,控制台打印输出:
一直运行,每1s(默认值) 执行一次
一.一.二.二 repeatSecondlyForever(int seconds) 方法
只需要将调度的那行代码替换可:
//.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever()) .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(2))
控制台打印输出:
一直运行,每隔两秒(参数传入值)运行一次。
一.一.二.三 repeatSecondlyForTotalCount(int count) 方法
//.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever()) //.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(2)) .withSchedule(SimpleScheduleBuilder.repeatSecondlyForTotalCount(3))
控制台打印输出:
只运行了三次,每隔1s(默认值)运行。
一.一.二.四 repeatSecondlyForTotalCount(int count, int seconds) 方法
//.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever()) //.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(2)) //.withSchedule(SimpleScheduleBuilder.repeatSecondlyForTotalCount(3)) .withSchedule(SimpleScheduleBuilder.repeatSecondlyForTotalCount(3, 2))
控制台打印输出:
只运行三次,每隔2s运行。
一.一.三 设置开始日期和结束日期启动
上面启动Trigger时,用的是 startNow(), 立即启动,也可以用 startAt(date) 和endAt(date) 来动态地设置 启动时间和结束时间, 常常用于条件触发和条件结束。
可以在任务里面,通过 JobExecutionContext 上下文来获取 开始时间和结束时间。
一.一.三.一 任务接口
//获取开始时间和结束时间 public class MyJob9 implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //格式化时间 String dateString=sdf.format(new Date()); //是设置的开始时间和结束时间,不会改变 System.out.println("开始时间:"+sdf.format(jobExecutionContext.getTrigger().getStartTime())); System.out.println("结束时间:"+sdf.format(jobExecutionContext.getTrigger().getEndTime())); System.out.println("备份数据库的时间是:"+dateString); } }
一.一.三.二 主程序调用
//startAt 和endAt 的用法 public class SchedulerDemo9 { public static void main(String[] args) throws Exception{ //获取Scheduler Scheduler scheduler= StdSchedulerFactory.getDefaultScheduler(); // 创建 JobDetail JobDetail jobDetail=JobBuilder.newJob(MyJob9.class) .withIdentity("job1","group1") .build(); //当前时间 Date nowDate=new Date(); //开始时间为 当前时间往后4s,即推迟4s执行 Date startDate=new Date(nowDate.getTime()+4000); //结束时间,往后跑10秒 Date endDate=new Date(startDate.getTime()+10000); //创建 Trigger Trigger trigger= TriggerBuilder.newTrigger() .withIdentity("trigger1","group1") //设置标识 .startAt(startDate) .endAt(endDate) // 设置为简单触发器,2s触发一次 .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(2)) .build(); //关联 job和 trigger scheduler.scheduleJob(jobDetail,trigger); //启动 scheduler scheduler.start(); } }
一.一.三.三 控制台打印输出
程序运行,大约4s之后,才打印出日志信息:
控制台打印输出:
虽然程序还在运行,但并不会执行任务,结束时间到了,一共执行了5次。
延迟4s执行, endDate-startDate=10s, 每2秒执行一次, 故执行 10/2=5 次。
在结束日期到时,会停止执行任务。
一.一.三.四 注意点
在任务类 MyJob9里面,打印了开始日期和结束日期, 如果在主程序里面,并没有设置 endAt(), 即没有设置结束日期, 那么获取时会出错。
//.endAt(endDate)
一.一.三.五 结束日期和运行次数先后关系
一.一.三.二的程序时,调度器是一直运行,但触发器Trigger 设置了结束日期, 当时间到达触发器的结束日期时,不会再继续执行作业调度了。
演示1: 当设置调度的次数时(5,5):
//.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(2)) // 设置为简单触发器 .withSchedule(SimpleScheduleBuilder.repeatSecondlyForTotalCount(5,5)) //想执行5次,超过结束日期
控制台打印输出:
只执行了2次, 到 Trigger 结束时间时暂停。
演示2: 当设置调度次数为(2,2)
//.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(2)) // 设置为简单触发器 //.withSchedule(SimpleScheduleBuilder.repeatSecondlyForTotalCount(5,5)) //想执行5次,超过结束日期 .withSchedule(SimpleScheduleBuilder.repeatSecondlyForTotalCount(2,2)) //想执行2次,未到结束时间
控制台打印输出:
只执行了2次。
结束日期和调度次数, 哪个条件先触发,就按照哪个条件的结果走。