Quartz资源及与Spring集成简单使用举例

Quartz是一个任务调度框架,任务调度是指按照预先指定好的时间、时间间隔或执行次数来自动执行任务,比如每天早上6:00从控制台上输出 “早上好”。多数的Web项目都具有任务调度的任务,而在java项目中实现任务调度的方式有很多种,这一点在IBM文献 《几种任务调度的 Java 实现方法与比较》 中已经陈述并举例了。此文简单整理一下资源,并简做介绍其使用及其与Spring的集成。

Quartz官网上你能够找到在线教程、API和实例、jar包等信息。任务调度过程在quartz中牵涉它的两大基本单元,一个是作业(可执行的任务),另一个是触发器。

要定期执行的作业需要实现org.quartz.job接口,我们要执行的code就在execute方法中。而quartz提供了三种可用的触发器,在《理解Quartz触发器>>。针对触发器CronTrigger值得学习一下Corn表达式,它能够帮助我们灵活的配置具体的日程安排。

简单说Corn表达式包括七个字段,分别是秒 分 时 月内日期 月 周内日期 年。其中年字段可以忽略不写,即那一年都执行,而其他字段就指明了具体是哪个月哪一天哪个时间执行。需要着重理解一下月内日期和周内日期,分别指几号和周几,这两个指只需要指定一个值,如果在月内日期指定为1号,在周内日期指定为五,但十月一却是周六,发生冲突。具体corn表达式的参数取值和一些特殊符号(-*/#?WLC)用法参考《Quartz Cron Expression》一文。

在java程序中举一个例子。首先写一个Job类,如下所示:

import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class JobService implements Job{ @Override public void execute(JobExecutionContext arg0) throws JobExecutionException { System.out.println("早上好"); } }


之后我们写一个java类配置,并启动调度器,此类代码注释也大致说明了启动调度计划的大致步骤,代码如下所示:

import org.quartz.CronExpression; import org.quartz.CronTrigger; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.impl.StdSchedulerFactory; public class Review { public static void main(String[] args) { try{ //开启调度器 task(); }catch(SchedulerException e){ e.printStackTrace(); } } protected static void task() throws SchedulerException { //初始化SchedulerFactory SchedulerFactory schedulerFactory = new StdSchedulerFactory(); // 获得Scheduler Scheduler scheduler = schedulerFactory.getScheduler(); //初始化JobDetail JobDetail jobDetail = new JobDetail("工作名称", "所属组名", JobService.class);//注意“JobService.class”就是上面写得Job类 //初始化cronTrigger CronTrigger cronTrigger = new CronTrigger("cronTrigger", "触发器组名"); try { //设定执行日期为每天60:00:00 CronExpression cexp = new CronExpression("0 0 6 ? * *"); //指派CronExpression cronTrigger.setCronExpression(cexp); } catch (Exception e) { e.printStackTrace(); } // 安排由触发器和工作详单指定的的工作计划 scheduler.scheduleJob(jobDetail, cronTrigger); //开启调度器 scheduler.start(); } }


此时运行这个java类即可每天执行定点执行咱们的任务了。如果我们的作业很多,而且需要在j2EE项目发布运行后就自定开启调度器而不是像上面需要手动启动,我们该如何做呢。

一个简单的做法可以通过配置web.xml文件,启动服务器时通过初始化servlet来完成启动调度器过程,这个方法的原理应用到quartz与spring集成上,只需要在web.xml文件中配置org.springframework.web.context.ContextLoaderServlet为应用服务器启动时自动运行就可以了。使用spring和quartz集成的好处还有很多。Spring本身具有IOC容器和工厂的作用,这样以来,上述代码中Review类对JobService类的依赖关系以及JobService类对Job接口的依赖都可以屏蔽掉,同时不需要再实际写出Review类,只需要在applicationContext.xml文件中进行一下配置就可以了。同样,这种配置还支持启动多任务,此处只对上面的例子进行改进。

Job类:

import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class JobService { public void execute(){ System.out.println("早上好"); } }


applicationContext.xml文件,它包含了上述Review类的功能:

<!-- job类--> <bean id = "JobService" class = "cn.com.jnpc.ecm.bpm.job.JobService "/> <!-- 定义调用对象和调用对象的方法 --> <bean id="jobtask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!-- 调用的类 --> <property name="targetObject"> <ref bean="JobService"/> </property> <!-- 调用类中的方法 --> <property name="targetMethod"> <value>execute</value> </property> </bean> <!-- 定义触发时间 --> <bean id="doTime" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"> <ref bean="jobtask"/> </property> <!-- cron表达式 --> <property name="cronExpression"> <!--设定审查日期每天凌晨60:00:00,执行一次--> <value>0 0 6 ? * *</value> </property> </bean> <!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 --> <bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="doTime"/> </list> </property> </bean>

Web.xml文件的配置如下所示,它实现了应用程序服务器启动时自动启动上述配置调度器:

<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param> <servlet> <servlet-name>context</servlet-name> <servlet-class> org.springframework.web.context.ContextLoaderServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> 掌握这个小例子和几个触发器的使用以及Corn表达式之后便可以解决一些调度任务了,Quartz还有很多高级应用如事务、持久化等等。多参考官方文档,以求提高哦!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值