Quartz
一、Quartz介绍
在企业应用中,我们经常会碰到时间任务调度的需求,比如每天凌晨生成前天报表,每小时生成一次汇总数据等等。Quartz是出了名的任务调度框架,它可以与J2SE和J2EE应用程序相结合,功能灰常强大,轻轻松松就能与Spring集成,使用方便。
二、Quartz中的概念
主要有三个核心概念:调度器、任务和触发器。三者关系简单来说就是,调度器负责调度各个任务,到了某个时刻或者过了一定时间,触发器触动了,特定任务便启动执行。概念相对应的类和接口有:
1)JobDetail:望文生义就是描述任务的相关情况;
2)Trigger:描述出发Job执行的时间触发规则。有SimpleTrigger和CronTrigger两个子类代表两种方式,一种是每隔多少分钟小时执行,则用SimpleTrigger;另一种是日历相关的重复时间间隔,如每天凌晨,每周星期一运行的话,通过Cron表达式便可定义出复杂的调度方案。
3)Scheduler:代表一个Quartz的独立运行容器,Trigger和JobDetail要注册到Scheduler中才会生效,也就是让调度器知道有哪些触发器和任务,才能进行按规则进行调度任务。
- SchedulerFactory -- 调度程序工厂
- StdSchedulerFactory -- Quartz默认的SchedulerFactory
- DirectSchedulerFactory -- DirectSchedulerFactory是对SchedulerFactory的直接实现,通过它可以直接构建Scheduler、threadpool 等
- ThreadExecutor / DefaultThreadExecutor -- 内部线程操作对象
- JobExecutionContext -- JOB上下文,保存着Trigger、 JobDeaitl 等信息,JOB的execute方法传递的参数就是对象的实例
- JobExecutionContextImpl
- Scheduler -- 调度器
- StdScheduler -- Quartz默认的Scheduler
- RemoteScheduler -- 带有RMI功能的Scheduler
- JOB --任务对象
- JobDetail -- 他是实现轮询的一个的回调类,可将参数封装成JobDataMap对象,Quartz将任务的作业状态保存在JobDetail中.
- JobDataMap -- JobDataMap用来报错由JobDetail传递过来的任务实例对象
- Trigger
- SimpleTrigger <普通的Trigger> -- SimpleScheduleBuilder
- CronTrigger <带Cron Like 表达式的Trigger> -- CronScheduleBuilder
- CalendarIntervalTrigger <带日期触发的Trigger> -- CalendarIntervalScheduleBuilder
- DailyTimeIntervalTrigger <按天触发的Trigger> -- DailyTimeIntervalScheduleBuilder
- ThreadPool -- 为Quartz运行任务时提供了一些线程
- SimpleThreadPool --一个Quartz默认实现的简单线程池,它足够健壮,能够应对大部分常用场景
- -----以上是Quartz涉及到的一些关键对象,详细的内容如有机会会在后续的文章中展开!
- SchedulerFactory -- 调度程序工厂
- Quartz类图
- 类图中主要分为5块:Factory、Bulider、Scheduler、Trigger、JOB
- 思想
-
- // 1、工厂模式 构建Scheduler的Factory,其中STD为Quartz默认的Factory
- // 开发者亦可自行实现自己的Factory;Job、Trigger等组件
- SchedulerFactory sf = new StdSchedulerFactory();
- // 2、通过SchedulerFactory构建Scheduler对象
- Scheduler sched = sf.getScheduler();
- // 3、org.quartz.DateBuilder.evenMinuteDate -- 通过DateBuilder构建Date
- Date runTime = evenMinuteDate( new Date());
- // 4、org.quartz.JobBuilder.newJob <下一分钟> --通过JobBuilder构建Job
- JobDetail job = newJob(HelloJob.class).withIdentity("job1","group1").build();
- // 5、通过TriggerBuilder进行构建Trigger
- Trigger trigger = newTrigger().withIdentity("trigger1","group1")
- .startAt(runTime).build();
- // 6、工厂模式,组装各个组件<JOB,Trigger>
- sched.scheduleJob (job, trigger);
- // 7、start
- sched.start();
- try {
- Thread.sleep(65L * 1000L);
- } catch (Exception e) {
- }
- // 8、通过Scheduler销毁内置的Trigger和Job
- sched.shutdown(true);
、创建调度工厂(); //工厂模式2、根据工厂取得调度器实例(); //工厂模式3、Builder模式构建子组件<Job,Trigger> // builder模式, 如JobBuilder、TriggerBuilder、DateBuilder4、通过调度器组装子组件 调度器.组装<子组件1,子组件2...> //工厂模式5、调度器.start(); //工厂模式
-
浙公网安备 33010602011771号