Quartz处理定时任务的核心概念.docVIP

  • 44
  • 0
  • 约3.26千字
  • 约 5页
  • 2015-09-27 发布于重庆
  • 举报
Quartz处理定时任务的核心概念

核心概念 1.Job:Job是任务执行的流程,是一个类 2.JobDetail:JobDetail是Job是实例,是一个对象,包含了该实例的执行计划和所需要的数据 3.Trigger:Trigger是定时器,决定任务何时执行 4.Scheduler:调度器,调度器接受一组JobDetail+Trigger即可安排一个任务,其中一个JobDetail可以关联多个Trigger 实例 1.初始化: 1 2 Scheduler?scheduler = StdSchedulerFactory.getDefaultScheduler(); scheduler.start(); 当程序退出时,应该主动调用shutdown()方法关闭该调度器。 2.Job: 一个Job类需要实现org.quartz.Job接口,这个接口值需要实现一个方法即可: 1 void execute(JobExecutionContext context)?throws JobExecutionException context是重要的上下文,可以访问到关联的JobDetail对象和本次触发的Trigger对象,以及在此之上设定的数据。 3.JobDetail: 可以使用JobBuilder来构建一个JobDetail对象: 1 2 3 4 5 6 7 JobDetail job = JobBuilder.newJob(MyJob.class) // MyJob是我实现的Job类 ????.withIdentity(myjob) // 可以给该JobDetail起一个id,便于之后的检索 ????.requestRecovery() // 执行中应用发生故障,需要重新执行 ????.storeDurably() // 即使没有Trigger关联时,也不需要删除该JobDetail ????.usingJobData(key1, value1) ????.usingJobData(key2, value2) // 以Key-Value形式关联数据 ????.build(); Quartz因为考虑到有些任务不是幂等的,不可以多次重复执行,所以默认没有开启“requestRecovery”。当确认业务中允许一次任务执行两次的情况下,可以开启该选项,则任务肯定不会因为应用停止而漏调用,但缺点就是,有可能会重复调用。 每个JobDetail内都有一个Map,包含了关联到这个Job的数据,在Job类中,可以通过context取出该数据,进行业务流程处理。 4.Trigger: 可以使用TriggerBuilder来构建一个Trigger对象: 1 2 3 4 5 6 7 8 Trigger trigger = TriggerBuilder.newTrigger() ????.forJob(myjob) // 关联上述的JobDetail ????.withIdentity(myjob-trigger1) // 给该Trigger起一个id ????.startAt(DateBuilder.futureDate(20, IntervalUnit.SECOND)) // 延迟20秒开始 ????.withSchedule(SimpleScheduleBuilder.repeatMinutelyForever()) // 每分钟触发一次,无限循环 ????.usingJobData(key3, value3) ????.usingJobData(key4, value4) // 以Key-Value形式关联数据 ????.build(); 5.设定: 因为上述的Trigger已经关联了JobDetail,可以使用 1 scheduler.scheduleJob(trigger); 把这一组JobDetail和Trigger加载到调度器上,接下来就会按照计划执行Job任务。 6.配置文件: 配置文件不是必须的,Quartz对配置项都是有默认值的,当需要自定义的时候,可以在classpath路径下放一个quartz.properties文件,Quartz的StdSchedulerFactory在启动时会自动加载该配置文件。 比较值得关注的是这两个配置项: 1 2 org.quartz.threadPool.threadCount=50 org.quartz.scheduler.batchTriggerAcquisitionMaxCount=50 第一个配置项是线程池里的线程数,默认值是10,当执行任务会并发执行多个耗时任务时,要根据业务特点选择线程池的大小。 第二个配置是,当检查某个Trigger应该触发时,默认每次只Acquire一个Trigg

文档评论(0)

1亿VIP精品文档

相关文档