您现在的位置是:首页 >  云笔记 >  开发随笔 >  文章详情

quartz 2.2.3 使用入门教程

admin   2019-12-16 15:52:53   825人已围观

quartz是什么?

       Quartz是OpenSymphony开源组织在Job scheduling领域的一个开源项目,可以用来创建Jobs定时任务。Quartz的英文全称是:Quartz Enterprise Job Scheduler,官网(http://www.quartz-scheduler.org/)最新版本为Quartz 2.2.3。Quartz是一个开源的任务调度框架。基于定时、定期的策略来执行任务是它的核心功能。Quartz有3个核心要素:调度器(Scheduler)、任务(Job)、触发器(Trigger)。Quartz完全使用Java开发,可以集成到各种规模的应用程序中。它能够承载成千上万的任务调度,并且支持集群。它支持将数据存储到数据库中以实现持久化,并支持绝大多数的数据库。它将任务与触发设计为松耦合,即一个任务可以对应多个触发器,这样能够轻松构造出极为复杂的触发策略。

Quartz有3个核心要素

调度器(Scheduler):

Quartz框架的核心是调度器。调度器负责管理Quartz应用运行时环境。调度器不是靠自己做所有的工作,而是依赖框架内一些非常重要的部件。Quartz不仅仅是线程和线程管理。为确保可伸缩性,Quartz采用了基于多线程的架构。启动时,框架初始化一套worker线程,这套线程被调度器用来执行预定的作业。这就是Quartz怎样能并发运行多个作业的原理。Quartz依赖一套松耦合的线程池管理部件来管理线程环境。Quartz提供了DirectSchedulerFactory和StdSchedulerFactory等工厂类,用于支持Scheduler相关对象的产生。

任务(Job):

实现该接口组件能被调度程序执行的任务类。Quartz将任务分为Job、JobDetail两部分,其中Job用来定义任务的执行逻辑,而JobDetail用来描述Job的定义(例如Job接口的实现类以及其他相关的静态信息)。对Quartz而言,主要有两种类型的Job,StateLessJob、StateFulJob

触发器(Trigger):

触发器,定义一个Job如何被调度器执行。Trigger用于定义调度任务的时间规则,在Quartz中主要有四种类型的Trigger:SimpleTrigger、CronTrigger、DataIntervalTrigger和NthIncludedTrigger。

核心元素之间关系

 执行时序图如下,图片来自网络:

 

 

入门demo

第一,下载quartz相关jar包,放入项目中,我这里以quartz2.2.3版本,springmvc框架为例,ApplicationContext-quartz.xml 文件:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd">

<!-- 1:定义任务的bean ,这里使用JobDetailFactoryBean,-->
<bean name="testJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<!-- 指定job的名称 -->
<property name="name" value="testJob"/>
<!-- 指定job的分组 -->
<property name="group" value="test_group"/>
<!-- 指定具体的job类 -->
<property name="jobClass" value="com.test.module.commonMgt.JOBS.STJob"/>
<!-- 必须设置为true,如果为false,当没有活动的触发器与之关联时会在调度器中会删除该任务 -->
<property name="durability" value="true"/>
<!-- 指定spring容器的key,如果不设定在job中的jobmap中是获取不到spring容器的 -->
<property name="applicationContextJobDataKey" value="applicationContext"/>
</bean>

<!-- 2:定义触发器的bean,定义一个Cron的Trigger,一个触发器只能和一个任务进行绑定 -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<!-- 指定Trigger的名称 -->
<property name="name" value="test_trigger"/>
<!-- 指定Trigger的名称 -->
<property name="group" value="test_trigger_group"/>
<!-- 指定Tirgger绑定的Job -->
<property name="jobDetail" ref="testJob"/>
<!-- 指定Cron 的表达式 ,当前是每隔5s运行一次 -->
<property name="cronExpression" value="0/5 * * * * ?" />
</bean>

<!-- 3.定义调度器,并将Trigger注册到调度器中 -->
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger"/>
</list>
</property>
<property name="autoStartup" value="true" />
</bean>
</beans>

第二,将ApplicationContext-quartz.xml 文件配置到项目web.xml中:

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:config/spring-mvc.xml,
classpath:config/spring-mybatis.xml
classpath:config/ApplicationContext-quartz.xml
</param-value>
</context-param>

第三、实现job类,这个其实应该放在第一步:

public class STJob implements Job {

/*
* 文件名:com.test.module.commonMgt.JOBS.STJob.java
* 简述:TODO
* 详述: TODO
* 参数:@param arg0
* 参数:@throws JobExecutionException
* 版权: www.onekbit.com所有
* 新建时间:2019年1月8日 下午11:00:01
* 新建:admin
* 版本:1.0
*
*/
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
// TODO 做点你喜欢的事
System.out.println("into com.test.module.commonMgt.JOBS.STJob#时间"+new Date());
}

}

到这里一个极其简单的quartz项目就启动了。


onekbit导航整理发布



分享到:

编辑发布时间:2019-12-16 15:52:53