欢迎来到天天文库
浏览记录
ID:12584659
大小:42.00 KB
页数:5页
时间:2018-07-17
《quartz处理定时任务的核心概念》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、核心概念1.Job:Job是任务执行的流程,是一个类2.JobDetail:JobDetail是Job是实例,是一个对象,包含了该实例的执行计划和所需要的数据3.Trigger:Trigger是定时器,决定任务何时执行4.Scheduler:调度器,调度器接受一组JobDetail+Trigger即可安排一个任务,其中一个JobDetail可以关联多个Trigger实例1.初始化:12Scheduler scheduler=StdSchedulerFactory.getDefaultScheduler();scheduler.start();当程序退出时,
2、应该主动调用shutdown()方法关闭该调度器。2.Job:一个Job类需要实现org.quartz.Job接口,这个接口值需要实现一个方法即可:1voidexecute(JobExecutionContextcontext) throwsJobExecutionExceptioncontext是重要的上下文,可以访问到关联的JobDetail对象和本次触发的Trigger对象,以及在此之上设定的数据。3.JobDetail:可以使用JobBuilder来构建一个JobDetail对象:1234567JobDetailjob=JobBuilder.new
3、Job(MyJob.class)//MyJob是我实现的Job类 .withIdentity("myjob")//可以给该JobDetail起一个id,便于之后的检索 .requestRecovery()//执行中应用发生故障,需要重新执行 .storeDurably()//即使没有Trigger关联时,也不需要删除该JobDetail .usingJobData("key1","value1") .usingJobData("key2","value2")//以Key-Value形式关联数据 .build();Quar
4、tz因为考虑到有些任务不是幂等的,不可以多次重复执行,所以默认没有开启“requestRecovery”。当确认业务中允许一次任务执行两次的情况下,可以开启该选项,则任务肯定不会因为应用停止而漏调用,但缺点就是,有可能会重复调用。每个JobDetail内都有一个Map,包含了关联到这个Job的数据,在Job类中,可以通过context取出该数据,进行业务流程处理。4.Trigger:可以使用TriggerBuilder来构建一个Trigger对象:12345678Triggertrigger=TriggerBuilder.newTrigger() .
5、forJob("myjob")//关联上述的JobDetail .withIdentity("myjob-trigger1")//给该Trigger起一个id .startAt(DateBuilder.futureDate(20,IntervalUnit.SECOND))//延迟20秒开始 .withSchedule(SimpleScheduleBuilder.repeatMinutelyForever())//每分钟触发一次,无限循环 .usingJobData("key3","value3") .usingJobData(
6、"key4","value4")//以Key-Value形式关联数据 .build();5.设定:因为上述的Trigger已经关联了JobDetail,可以使用1scheduler.scheduleJob(trigger);把这一组JobDetail和Trigger加载到调度器上,接下来就会按照计划执行Job任务。6.配置文件:配置文件不是必须的,Quartz对配置项都是有默认值的,当需要自定义的时候,可以在classpath路径下放一个quartz.properties文件,Quartz的StdSchedulerFactory在启动时会自动加载该配
7、置文件。比较值得关注的是这两个配置项:12org.quartz.threadPool.threadCount=50org.quartz.scheduler.batchTriggerAcquisitionMaxCount=50第一个配置项是线程池里的线程数,默认值是10,当执行任务会并发执行多个耗时任务时,要根据业务特点选择线程池的大小。第二个配置是,当检查某个Trigger应该触发时,默认每次只Acquire一个Trigger,(为什么要有Acquire的过程呢?是为了防止多线程访问的情况下,同一个Trigger被不同的线程多次触发)。尤其是使用JDBCJ
8、obStore时,一次Acquire就是一个update语句,尽可
此文档下载收益归作者所有