博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Quartz入门例子简介 从入门到菜鸟(二)
阅读量:5327 次
发布时间:2019-06-14

本文共 2811 字,大约阅读时间需要 9 分钟。

本节补充一些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(null, 13);  

  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对象中。 

这节比较简单。

 

本文链接:,转自:http://wwwcomy.iteye.com

转载于:https://www.cnblogs.com/licomeback/articles/3057012.html

你可能感兴趣的文章
大数据学习
查看>>
简单工厂模式
查看>>
Delphi7编译的程序自动中Win32.Induc.a病毒的解决办法
查看>>
Objective-C 【关于导入类(@class 和 #import的区别)】
查看>>
倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-点击运行按钮进入到运行状态报错Error starting TwinCAT System怎么办 AdsWarning1823怎么办...
查看>>
【转】javascript 中的很多有用的东西
查看>>
Centos7.2正常启动关闭CDH5.16.1
查看>>
Android 监听返回键、HOME键
查看>>
Android ContentProvider的实现
查看>>
sqlserver 各种判断是否存在(表名、函数、存储过程等)
查看>>
给C#学习者的建议 - CLR Via C# 读后感
查看>>
Recover Binary Search Tree
查看>>
Java 实践:生产者与消费者
查看>>
[转]IOCP--Socket IO模型终结篇
查看>>
js 获取视频的第一帧
查看>>
各种正则验证
查看>>
观察者模式(Observer)
查看>>
python中numpy.r_和numpy.c_
查看>>
egret3D与2D混合开发,画布尺寸不一致的问题
查看>>
freebsd 实现 tab 命令 补全 命令 提示
查看>>