Quartz入门例子简介 从入门到菜鸟(二)

本节补充一些SimpleTrigger的API使用,文章一次性写的太长会大大降低可阅读性,所以还是少食多餐吧。 

顺大便 回顾一下Quartz的基本使用方法 ,联系windows自带的计划任务,假想场景如下: 
  • 1.我要让电脑查杀病毒(对应Quartz: 实现Job接口的execute方法,后期通过反射实例化JobDetail对象)。
  • 2.我想让电脑在五分钟之后做查杀病毒这个job(对应Quartz:通过TriggerBuilder来new出一个时间为五分钟之后的Trigger)。
  • 3.把上面我想象到的时间:五分钟之后;任务:查杀病毒 放到windows的定时任务当中,点击确定(对应Quartz:通过SchedulerFactory拿到Scheduler实例,将JobDetail与Trigger通过scheduleJob方法注册到Scheduler中,再调用start方法就可以了)。


下面先对MyJob做个小改动,让我们定义的任务Key打印出来。 

Java代码   收藏代码
  1. public class MyJob implements Job {  
  2.     @Override  
  3.     public void execute(JobExecutionContext context) throws JobExecutionException {  
  4.                 // @NOTICE JobExecutionContext 是任务执行的上下文,可以拿到任务的Key  
  5.         String jobName = context.getJobDetail().getKey().getName();  
  6.         System.out.println("任务Key:" + jobName + " 正在执行,执行时间: " + Calendar.getInstance().getTime());  
  7.     }  
  8. }  


接下来这个小例子是QuartzMultiJobTest.java,是个多任务例子,比如说,我想让我的任务五秒钟后执行,并且开始执行之后,隔三秒钟再执行一次,再隔三秒钟再执行一次,实现如下,注意@NOTICE标记: 

Java代码   收藏代码
  1. public class QuartzMultiJobTest {  
  2.     public static void main(String[] args) throws Throwable {  
  3.         SchedulerFactory factory = new StdSchedulerFactory();  
  4.         Scheduler scheduler = factory.getScheduler();  
  5.         // @NOTICE 任务的开始时间,nextGivenSecondDate方法表示:当前时间之后,每当秒数是13的倍数都是触发时间,当然只触发一次  
  6.         // 比如:00:00:12秒开始主线程,则13秒就会触发任务,如果00:00:14秒开始主线程,则在26秒触发任务  
  7.         Date runTime = DateBuilder.nextGivenSecondDate(null13);  
  8.         JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("job1""group1").build();  
  9.         Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1""group1").startAt(runTime).build();  
  10.         scheduler.scheduleJob(job, trigger);  
  11.           
  12.         // @NOTICE 将同一个Job实现作为另外一个任务注册到scheduler,注意名字要区分  
  13.         job = JobBuilder.newJob(MyJob.class).withIdentity("job2""group1").build();  
  14.         trigger = TriggerBuilder.newTrigger().withIdentity("trigger2""group1").startAt(runTime).build();  
  15.         scheduler.scheduleJob(job, trigger);  
  16.   
  17.         // @NOTICE 重复执行,job3表示第一次执行完之后,每隔3秒钟执行一次,重复5次,withRepeatCount参数不包括第一次执行那次,即job3总共执行6次  
  18.         job = JobBuilder.newJob(MyJob.class).withIdentity("job3""group1").build();  
  19.         trigger = TriggerBuilder.newTrigger().withIdentity("trigger3""group1")  
  20.                 .withSchedule(SimpleScheduleBuilder.simpleSchedule().withRepeatCount(5).withIntervalInSeconds(3)).startAt(runTime).build();  
  21.         scheduler.scheduleJob(job, trigger);  
  22.   
  23.         scheduler.start();  
  24.         try {  
  25.             // 等待20秒  
  26.             Thread.sleep(20L * 1000L);  
  27.         } catch (Exception e) {  
  28.   
  29.         }  
  30.         scheduler.shutdown(true);  
  31.     }  
  32. }  


主要需要理解的是 
1.DateBuilder.nextGivenSecondDate这个方法的执行时间 
2.同一个任务可以多次注册 
3.重复执行需要在Trigger的设置里面加入SimpleScheduleBuilder,设置重复次数和重复时间即可。repeatForever()方法永远表示一直重复执行。 
4.有三个API用法没放到例子中: 
  a.scheduler.addJob(job, true); //无trigger注册,表示任务立即执行。 
  b.scheduler.rescheduleJob(trigger.getKey(), trigger); //在scheduler.start之后调用,可以在job开始后重新定义trigger,然后重新注册。 
  c.scheduler.getMetaData().getNumberOfJobsExecuted() 可以在shutdown后取出执行的任务数量,一些基本信息封装在SchedulerMetaData对象中。 

这节比较简单。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值