Quartz——任务调度框架

目录

Quartz是一个完全由Java编写的开源任务调度的框架,通过触发器设置作业定时运行规则,控制作业的运行时间。其中Quartz集群通过故障切换和负载平衡的功能,能给调度器带来高可用性和伸缩性。主要用来执行定时任务,如:定时发送信息、定时生成报表等等。

1.Quartz核心概念

11627468_1438829844Zbz8.png

概念

含义

Job

任务,即被调度的任务。是一个接口,只有一个方法void execute(JobExecutionContext context),开发者实现该接口定义运行任务,JobExecutionContext类提供了调度上下文的各种信息。Job运行时的信息保存在JobDataMap实例中

JobDetail

Quartz在每次执行Job时,都重新创建一个Job实例,所以它不直接接受一个Job的实例,相反它接收一个Job实现类,以便运行时通过newInstance()的反射机制实例化Job。因此需要通过一个类来描述Job的实现类及其它相关的静态信息,如Job名字、描述、关联监听器等信息,JobDetail承担了这一角色。

Trigger

是一个类,描述触发Job执行的时间触发规则。主要有SimpleTrigger和CronTrigger这两个子类。当仅需触发一次或者以固定时间间隔周期执行,SimpleTrigger是最适合的选择;而CronTrigger则可以通过Cron表达式定义出各种复杂时间规则的调度方案:如每早晨9:00执行,周一、周三、周五下午5:00执行等

Calendar

org.quartz.Calendar和java.util.Calendar不同,它是一些日历特定时间点的集合(可以简单地将org.quartz.Calendar看作java.util.Calendar的集合——java.util.Calendar代表一个日历时间点,无特殊说明后面的Calendar即指org.quartz.Calendar)。一个Trigger可以和多个Calendar关联,以便排除或包含某些时间点。假设,我们安排每周星期一早上10:00执行任务,但是如果碰到法定的节日,任务则不执行,这时就需要在Trigger触发机制的基础上使用Calendar进行定点排除。

Scheduler

代表一个Quartz的独立运行容器,Trigger和JobDetail可以注册到Scheduler中,两者在Scheduler中拥有各自的组及名称,组及名称是Scheduler查找定位容器中某一对象的依据,Trigger的组及名称必须唯一,JobDetail的组和名称也必须唯一(但可以和Trigger的组和名称相同,因为它们是不同类型的)。Scheduler定义了多个接口方法,允许外部通过组及名称访问和控制容器中Trigger和JobDetail。

ThreadPool

Scheduler使用一个线程池作为任务运行的基础设施,任务通过共享线程池中的线程提高运行效率。

misfire

错过执行的任务,指本来应该被执行但实际没有被执行的任务调度。

Scheduler可以将Trigger绑定到某一JobDetail中,这样当Trigger触发时,对应的Job就被执行。一个Job可以对应多个Trigger(如:每天早上发送邮件,节假日除外,就可以定义两个Trigger),但一个Trigger只能对应一个Job。可以通过SchedulerFactory创建一个Scheduler实例。Scheduler拥有一个SchedulerContext,它类似于ServletContext,保存着Scheduler上下文信息,Job和Trigger都可以访问SchedulerContext内的信息。SchedulerContext内部通过一个Map,以键值对的方式维护这些上下文数据,SchedulerContext为保存和获取数据提供了多个put()和getXxx()的方法。可以通过Scheduler# getContext()获取对应的SchedulerContext实例;

2.Quartz设计分析

2.1 quartz.properties

Quartz的jar包中有一个叫做quartz.properties的配置文件,它允许你修改框架运行时环境。缺省是使用Quartz.jar里面的quartz.properties文件。当然,你应该创建一个quartz.properties文件的副本并且把它放入你工程的classes目录中以便类加载器找到它。一旦将Quartz.jar文件和第三方库加到自己的工程里面并且quartz.properties文件在工程的classes目录中,就可以创建作业了。

Quartz默认的配置文件quartz.properties如下:


   
   
   
  1. # Default Properties file for use by StdSchedulerFactory
  2. # to create a Quartz Scheduler Instance, if a different
  3. # properties file is not explicitly specified.
  4. #
  5. org .quartz .scheduler .instanceName: DefaultQuartzScheduler
  6. org .quartz .scheduler .rmi .export: false
  7. org .quartz .scheduler .rmi .proxy: false
  8. org .quartz .scheduler .wrapJobExecutionInUserTransaction: false
  9. org .quartz .threadPool .class: org .quartz .simpl .SimpleThreadPool
  10. org .quartz .threadPool .threadCount: 10
  11. org .quartz .threadPool .threadPriority: 5
  12. org .quartz .threadPool .threadsInheritContextClassLoaderOfInitializingThread: true
  13. org .quartz .jobStore .misfireThreshold: 60000
  14. org .quartz .jobStore .class: org .quartz .simpl .RAMJobStore

2.2 Quartz Demo

2.2.1SimpleTrigger创建简单的任务


   
   
   
  1. package com.test.quartzdemo.helloworld;
  2. import org.quartz.*;
  3. import org.quartz.impl.StdSchedulerFactory;
  4. /**
  5. * @Author zhouguanya
  6. * @Date 2018/6/10
  7. * @Description
  8. */
  9. public class SimpleTriggerDemo {
  10. public static void main(String[] args) throws InterruptedException {
  11. //通过schedulerFactory获取一个调度器
  12. SchedulerFactory schedulerfactory = new StdSchedulerFactory();
  13. Scheduler scheduler = null;
  14. try {
  15. // 通过schedulerFactory获取一个调度器
  16. scheduler = schedulerfactory.getScheduler();
  17. // 创建jobDetail实例,绑定Job实现类
  18. // 指明job的名称,所在组的名称,以及绑定job类
  19. JobDetail job = JobBuilder.newJob(HelloQuartz.class).withIdentity( "JobName", "JobGroupName").build();
  20. // 定义调度触发规则
  21. // SimpleTrigger
  22. Trigger trigger = TriggerBuilder.newTrigger().withIdentity( "SimpleTrigger", "SimpleTriggerGroup")
  23. .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever( 1).withRepeatCount( 5))
  24. //默认当前时间启动
  25. .startNow().build();
  26. // cron表达式 每1秒执行一次 (http://cron.qqe2.com/)
  27. // Trigger trigger=TriggerBuilder.newTrigger().withIdentity("CronTrigger1", "CronTriggerGroup")
  28. // .withSchedule(CronScheduleBuilder.cronSchedule("*/1 * * * * ?"))
  29. // .startNow().build();
  30. //把作业和触发器注册到任务调度中
  31. scheduler.scheduleJob(job, trigger);
  32. // 启动调度
  33. scheduler.start();
  34. Thread.sleep( 10000);
  35. // 停止调度
  36. scheduler.shutdown();
  37. } catch (SchedulerException e) {
  38. e.printStackTrace();
  39. }
  40. }
  41. }

2.2.1CronTrigger创建基于Crontab的任务


   
   
   
  1. package com.test.quartzdemo.helloworld;
  2. import org.quartz.*;
  3. import org.quartz.impl.StdSchedulerFactory;
  4. /**
  5. * @Author zhouguanya
  6. * @Date 2018/6/10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值