需求明确了,那么如何去实现类似这样的功能呢?很早的方法是使用JDK自带的Timer和TimerTask类,可经过测试,要想做到精准的定时,还是比较困难的。那么有其它解决方案吗?当然,使用Quartz,来,一起科普一下,什么是Quartz,如何在Spring中整合Quartz实现定时执行。
一:Quartz
Quartz在百度中是这么解析的:
是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。Quartz的最新版本为Quartz 2.3.0。
Quartz是一个完全由java编写的开源作业调度框架。不要被作业调度这词眼惊吓,其实Quartz的原理不是很复杂,只要搞明白几个概念,然后知道如何去启动和关闭一个调度程序即可。
1、Job
表示一个工作,要执行的具体内容。此接口中只有一个方法:
void execute(JobExecutionContext context)
2、JobDetail
JobDetail表示一个具体的可执行的调度程序,它本身可能是有状态的,Job是这个可执行程调度程序所要执行的内容,另外JobDetail还包含了这个任务调度的方案和策略。
3、Trigger
代表一个调度参数的配置,什么时候去调。
4、Scheduler
代表一个调度容器(总部),一个调度容器中可以注册多个JobDetail和Trigger。当Trigger与JobDetail组合,就可以被Scheduler容器调度了。
原理图:
二:第一个程序实例
如果是非maven工程,需要导入以下几个包
log4j.jar
quartz-2.3.0.jar
slf4j-api-1.6.1.jar
slf4j-log4j12-1.6.1.jar
如果是maven工程,则去maven的类库官网下载对应的jar包,配置在pom.xml文件中即可
applicationContext-quartz.xml
内容如下:
(如获取源码,请关注公众号并留言小编即可)
<import resource="classpath:applicationContext-quartz.xml"/>
三:总结
1、搞清楚了上Quartz容器执行作业的的原理和过程,以及作业形成的方式,作业注册到容器的方法。就认识明白了Quartz的核心原理。
2、Quartz虽然很庞大,但是一切都围绕这个核心转,为了配置强大时间调度策略,可以研究专门的CronTrigger。要想灵活配置作业和容器属性,可以通过Quartz的properties文件或者XML来实现。
3、要想调度更多的持久化、结构化作业,可以通过数据库读取作业,然后放到容器中执行。
4、所有的一切都围绕这个核心原理转,搞明白这个了,再去研究更高级用法就容易多了。
5、Quartz与Spring的整合也非常简单,Spring提供一组Bean来支持:MethodInvokingJobDetailFactoryBean、SimpleTriggerBean、SchedulerFactoryBean,看看里面需要注入什么属性即可明白了。Spring会在Spring容器启动时候,启动Quartz容器。
6、Quartz容器的关闭方式也很简单,如果是Spring整合,则有两种方法,一种是关闭Spring容器,一种是获取到SchedulerFactoryBean实例,然后调用一个shutdown就搞定了。如果是Quartz独立使用,则直接调用scheduler.shutdown(true);
7、Quartz的JobDetail、Trigger都可以在运行时重新设置,并且在下次调用时候起作用。这就为动态作业的实现提供了依据。你可以将调度时间策略存放到数据库,然后通过数据库数据来设定Trigger,这样就能产生动态的调度。
五:关于cronExpression的介绍