聊聊Quartz那点事儿
2015-12-20 21:16
295 查看
时间如白驹过隙,转瞬即逝,转眼间又到了一年的尾声。去年这个时候,还是一个刚刚走出学校,加入程序员队伍的一名小菜鸟程序员,这一年经历过了几个项目的洗礼,已经成长为了一名大菜鸟程序员。去年此时,正好有幸学习公司已经完成的支付网关的项目,对于一个初入行业的新人,项目中用到技术对我的吸引实在是太大了。今天就来聊聊这个项目中用到的定时任务框架Quartz。
Quartz是一个拥有丰富特性,开源的作业调度类库。小到独立的java应用程序,大到电子商务系统都可以将Quartz整合到其中。Quartz可以创建简单或者复杂的调度程序来执行作业,而作业作为java的组件来执行你希望实现的任何功能。
我的描述:Quartz就是在对的时间做对的事。
作业(Job)
作业就是你希望在对的时间做什么事。在Quartz中作业的定义很简单,只需要实现Job接口,并实现它的execute方法就可以定义你希望做的事情。
例如:
关于作业的存储:在Quartz中对作业有多种的持久化操作。
JobStore接口,它提供了多种多样的机制来存储作业。
JDBCJobStore接口,它可以将作业通过JDBC存储到数据库中。
RAMJobStore,通常我们使用的是RAMJobStore,将作业以及触发器存储在内存中。
触发器(Trigger)
触发器会在你希望的对的时间对作业进行触发。在Quartz中,已经定义好了一系列的builder类,它们可以被开发人员用来创建相应的触发器,作业,作业调度等对象。在创建触发器的时候,我们只需要使用TriggerBuilder即可创建Trigger即可。在实际应用中,比较常用的两种触发器是SimpleTrigger和CronTrigger。
SimpleTrigger:用于简单的触发以及重复执行作业任务。首先看一段代码:
正如上面代码所展示的,使用DateBuilder类创建一个触发时间,使用JobBuilder创建一个简单的作业任务,再使用TriggerBuilder来创建一个简单触发器,这个触发器会在DateBuilder创建的时间开始,根据SimpleScheduleBuilder所设定的每5秒触发一次,直到永远地执行JobBuilder所创建的作业任务。
基本的使用就是这样咯。当然,触发器的创建以及作业调度的方式方法还有很多,具体的使用还请您查阅Quartz的API,在此就不赘述了。
CronTrigger:使用cron表达式来进行计划作业任务设定的触发器。
Oracle对Cron表达式的描述:
Cron expressions are used to configure instances of CronTrigger, a subclass of org.quartz.Trigger. A cron expression is a string consisting of six or seven subexpressions (fields) that describe individual details of the schedule.
刚开始接触cron表达式的时候很是让人抓狂,因为正如Oracle对它的描述一样,在一个cron表达式中会包含6或者7个域。对于第一次接触这种描述方式的表达式,很容易就被到底这六个值或七个值代表了什么意思?而此时我学习的方法是外事问谷哥,内事找度娘。百度了很多cron表达式的例子,见识的多了渐渐的也就了解了cron表达式的含义。关于cron表达式的内容在此也不赘述,我本身也是对其不甚了解,您可以参阅这两篇文章学习,《cron表达式的解释》以及《cron表达式详解》
在Quartz中创建一个CronTrigger与创建SimpleTrigger类似,都是使用TriggerBuilder来进行创建,例如下面这段代码所展示:
关于CronTrigger没有特别要强调的,只需要学会cron表达式的编写即可。
作业调度(Scheduler)
作业调度就是将触发器与作业任务整合起来,在正确的时间调用触发器去触发执行作业任务。
在Quartz中,通常使用工厂类来获取作业调度对象,如下:
如上例所展示,使用的是标准工厂StdSchedulerFactory来获取Scheduler 对象。
Scheduler 对象也有其自己的生命周期,它的生命周期从factory.getScheduler()开始,直到scheduler.shutdown()时结束。一旦调用了shutdown方法,那么线程及其他资源都会释放,那么就无法再获取到这个scheduler对象了。如果希望暂停一下任务的执行,那么可以调用suspend方法来挂起任务执行。
初识
官方文档对Quartz的描述:Quartz是一个拥有丰富特性,开源的作业调度类库。小到独立的java应用程序,大到电子商务系统都可以将Quartz整合到其中。Quartz可以创建简单或者复杂的调度程序来执行作业,而作业作为java的组件来执行你希望实现的任何功能。
我的描述:Quartz就是在对的时间做对的事。
再看
在Quartz官网下载了他的文档,有好几篇,看着也真是够够的了。其实我认为只需要了解三个核心的内容,就可以对Quartz进行使用了。三个核心内容是什么呢?作业,触发器,调度程序。下面我们依次聊聊这三项。作业(Job)
作业就是你希望在对的时间做什么事。在Quartz中作业的定义很简单,只需要实现Job接口,并实现它的execute方法就可以定义你希望做的事情。
例如:
public class HelloJob implements Job { Logger logger=LoggerFactory.getLogger(HelloJob.class); @Override public void execute(JobExecutionContext arg0) throws JobExecutionException { logger.info("Hello World:"+new Date()); } }
关于作业的存储:在Quartz中对作业有多种的持久化操作。
JobStore接口,它提供了多种多样的机制来存储作业。
JDBCJobStore接口,它可以将作业通过JDBC存储到数据库中。
RAMJobStore,通常我们使用的是RAMJobStore,将作业以及触发器存储在内存中。
触发器(Trigger)
触发器会在你希望的对的时间对作业进行触发。在Quartz中,已经定义好了一系列的builder类,它们可以被开发人员用来创建相应的触发器,作业,作业调度等对象。在创建触发器的时候,我们只需要使用TriggerBuilder即可创建Trigger即可。在实际应用中,比较常用的两种触发器是SimpleTrigger和CronTrigger。
SimpleTrigger:用于简单的触发以及重复执行作业任务。首先看一段代码:
@Test public void test04(){ logger.info("--------初始化调度程序-----"); Scheduler scheduler=getScheduler();//通过工厂类SchedulerFactory创建Scheduler,详见后文 logger.info("--------初始化调度程序完成-----"); //返回当前时间加10秒 Date triggerStartTime=DateBuilder.nextGivenSecondDate(null, 10); JobDetail job=JobBuilder.newJob(SimpleJob.class).withIdentity("job", "group").build(); //设定5秒重复触发一次,直到永远 SimpleTrigger simpleTrigger=(SimpleTrigger) TriggerBuilder.newTrigger(). withIdentity("trigger", "group").startAt(triggerStartTime). withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(5)). build(); logger.info(job+"--------"+simpleTrigger.getRepeatCount()); try { scheduler.scheduleJob(job, simpleTrigger); logger.info("--------作业调度开始---------"); scheduler.start(); //这里sleep的目的是避免主线程在触发器触发之前就结束了 try { Thread.sleep(100000); } catch (InterruptedException e) { e.printStackTrace(); } logger.info("------- 准备结束 -------------------"); scheduler.shutdown(true); logger.info("------- 结束完成 -------------------"); } catch (SchedulerException e) { e.printStackTrace(); } }
正如上面代码所展示的,使用DateBuilder类创建一个触发时间,使用JobBuilder创建一个简单的作业任务,再使用TriggerBuilder来创建一个简单触发器,这个触发器会在DateBuilder创建的时间开始,根据SimpleScheduleBuilder所设定的每5秒触发一次,直到永远地执行JobBuilder所创建的作业任务。
基本的使用就是这样咯。当然,触发器的创建以及作业调度的方式方法还有很多,具体的使用还请您查阅Quartz的API,在此就不赘述了。
CronTrigger:使用cron表达式来进行计划作业任务设定的触发器。
Oracle对Cron表达式的描述:
Cron expressions are used to configure instances of CronTrigger, a subclass of org.quartz.Trigger. A cron expression is a string consisting of six or seven subexpressions (fields) that describe individual details of the schedule.
刚开始接触cron表达式的时候很是让人抓狂,因为正如Oracle对它的描述一样,在一个cron表达式中会包含6或者7个域。对于第一次接触这种描述方式的表达式,很容易就被到底这六个值或七个值代表了什么意思?而此时我学习的方法是外事问谷哥,内事找度娘。百度了很多cron表达式的例子,见识的多了渐渐的也就了解了cron表达式的含义。关于cron表达式的内容在此也不赘述,我本身也是对其不甚了解,您可以参阅这两篇文章学习,《cron表达式的解释》以及《cron表达式详解》
在Quartz中创建一个CronTrigger与创建SimpleTrigger类似,都是使用TriggerBuilder来进行创建,例如下面这段代码所展示:
@Test public void test05(){ logger.info("-----初始化调度程序-----"); Scheduler scheduler = getScheduler(); logger.info("-----初始化完成-----"); /* * cron表达式有两种格式: * 1.秒 分 时 月中天 月 周中天 年 * 2.秒 分 时 月中天 月 周中天 */ JobDetail cronJob=JobBuilder.newJob(CronJob.class).withIdentity("cronJob", "group").build(); //cron表达式的意思为15点51分50秒 CronTrigger cronTrigger=(CronTrigger) TriggerBuilder.newTrigger().withIdentity("cronTrigger", "group"). withSchedule(CronScheduleBuilder.cronSchedule("50 51 15 * * ?")).build(); try { scheduler.scheduleJob(cronJob, cronTrigger); scheduler.start(); try { Thread.sleep(100000); } catch (InterruptedException e) { e.printStackTrace(); } logger.info("------- 准备结束 -------------------"); scheduler.shutdown(true); logger.info("------- 结束完成 -------------------"); } catch (SchedulerException e) { e.printStackTrace(); } }
关于CronTrigger没有特别要强调的,只需要学会cron表达式的编写即可。
作业调度(Scheduler)
作业调度就是将触发器与作业任务整合起来,在正确的时间调用触发器去触发执行作业任务。
在Quartz中,通常使用工厂类来获取作业调度对象,如下:
private Scheduler getScheduler() { SchedulerFactory factory=new StdSchedulerFactory(); Scheduler scheduler=null; try { scheduler=factory.getScheduler(); } catch (SchedulerException e) { e.printStackTrace(); } return scheduler; }
如上例所展示,使用的是标准工厂StdSchedulerFactory来获取Scheduler 对象。
Scheduler 对象也有其自己的生命周期,它的生命周期从factory.getScheduler()开始,直到scheduler.shutdown()时结束。一旦调用了shutdown方法,那么线程及其他资源都会释放,那么就无法再获取到这个scheduler对象了。如果希望暂停一下任务的执行,那么可以调用suspend方法来挂起任务执行。
总结
至此,关于Quartz的基本的学习了解就到一段落了。我认为只要了解了上述的关于Quartz的基本的三个元素,那么再根据具体的需求,对应Quartz的API,就可以很好的解决有关计划任务的问题了。相关文章推荐
- 限制图片显示的尺寸
- 利用运行时关联(runtime)给分类(Category)中的属性存值.
- 数组易错题与课堂小结
- 软件工程实践总结
- python函数的使用和返回值
- 贪心+二分 Codeforces609D Gadgets for dollars and pounds
- email驗證
- Windows下动态库和静态库的浅要对比分析
- 有关Doxygen及Graphviz代码分析软件
- 虚拟机VMware无法识别USB设备
- centos7 yum install php php-fpm
- LeetCode题解:Binary Tree Paths
- 南沙政府应急系统之GIS一张图(arcgis api for flex)讲解(五)地图切换以及图层显示模块
- JavaScript DOM初识
- Android JNI NDK
- POJ 1383(图搜)(广搜)(bfs)
- Windows下的常见动态库介绍
- ProgressBar 深入分析
- 类 QQ 侧拉删除
- 转-cocos2d-x之触屏时间详解