任务调度Quartz初探Demo(一)

在上一遍博文XML处理利器:XStream ,较为简单的阐述了使用XStream解析XML配置文件的技术。但是抛出了一个问题,如果要修改配置文件,则需要重新启动服务,这不是很戳吗。因此,最好通过一种方法能够每隔一段时间去读取下这个配置文件。
基于上面的这种需求,有三种实现方式:
(1)使用开源的任务调度框架Quartz
(2)使用JDK 1.3之后提供的java.util.Timer和java.util.TimerTask实现简单的任务调度
(3)使用JDK 1.5之后提供的并发工具包java.util.concurrent
本文主要简单介绍下Quartz,并提供简单的Demo代码。本文主要参考《Spring 3.X 企业应用开发实战》第13章内容,加了一下自己的理解,自己的应用。

Quartz概述

Quartz是开源的任务调度框架中的翘楚,而且Spring为Quartz提供了较为全面的支持,提供了便利的FactoryBean类,以便在Spring容器中享受注入的好处。Quartz还提供了调度运行环境的持久化机制。也就是说,如果一个任务计划执行500次,但是执行到250次时,服务挂了,崩溃了,难道重启服务之后,重新开始执行一遍?有些任务可能可以,但是,你给别人转账呢?损失有点多。因此,需要将一些这些信息持久化到数据库或者文件中。

Quartz框架

Quartz框架图
由上图所示,Quartz主要由Job, JobDetail, Trigger, Calendar, Scheduler, ThreadPool, SchedulerContext组成。下面详细介绍各组成部分。
1.Job
Job是一个接口,只有一个方法

void execute(JobExecutionContext var1) throws JobExecutionException;

开发者实现该接口定义需要执行的任务。这个方法的参数JobExecutionContext var1提供了调度上下文中的信息。
下面的demo片段如下:

public class XmlParserJob implements Job {
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
    //获取JobDetail中的JobDataMap中的信息
    Map dataMap = jobExecutionContext.getJobDetail().getJobDataMap();
    //获取Trigger中的JobDataMap中的信息
    Map triggerDataMap = jobExecutionContext.getTrigger().getJobDataMap();
    .........
    }
}

在spring的xml中配置JobDetailBean时,可以通过jobDataAsMap属性来为JobDataMap提供值。
spring的xml配置片段如下所示:

<bean id="xmlParserJob"
          class="org.springframework.scheduling.quartz.JobDetailBean"
          p:jobClass="org.fan.test.xstream.XmlParserJob"
          p:applicationContextJobDataKey="applicationContext">
        <property name="jobDataAsMap">
            <map>
                <entry key="size" value="10"/>
            </map>
        </property>
    </bean>

    <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"
          p:jobDetail-ref="xmlParserJob"
          p:startDelay="1000"
          p:repeatInterval="2000"
          p:repeatCount="100">
        <property name="jobDataAsMap">
            <map>
                <entry key="count" value="22"/>
            </map>
        </property>
    </bean>

通过debug看到的JobExecutionContext数据如下所示:
这里写图片描述
从上图可以看到jobDetail是无状态的(稍后详解);tigger显示nextFireTime为Thu Feb 18 18:00:31 CST 2016,而scheduledFireTime值为Thu Feb 18 18:00:29 CST 2016,由此可见,调用之间的间隔是2S,这与trigger的配置属性p:repeatInterval=”2000”是一致的;从jobDataMap中可以看到在xml配置的数据,其中有一个applicationContext,说明我们可以通过jobDataMap得到spring的ApplicationContext信息(需要在配置jobDetail时给出p:applicationContextJobDataKey=”applicationContext”属性)。

Job接口还有一个没有任何方法的子接口StatefulJob。

public interface StatefulJob extends Job {
}

关于有状态无状态的区别:有状态的不可并发执行。有状态的任务共享同一个JobDataMap实例,每次任务执行对JobDataMap进行的更改都会保存下来,后面的执行可以看到这个更改。而无状态任务执行时,拥有自己的JobDataMap的复制,因此可以并发执行。

2.JobDetail
Quartz在每次执行job时,都重新创建一个job实例,所以,quartz不是接受一个job实例,而是一个Job实现类,在运行时,通过newInstance()的反射调用机制实例化Job。因此,需要通过一个对象来描述Job的实现类及一些静态信息,如Job名称,组名,关联监听器等信息。

<bean id="xmlParserJob"
          class="org.springframework.scheduling.quartz.JobDetailBean"
          p:jobClass="org.fan.test.xstream.XmlParserJob"
          p:applicationContextJobDataKey="applicationContext">
        <property name="jobDataAsMap">
            <map>
                <entry key="size" value="10"/>
            </map>
        </property>
    </bean>

从上面的代码片段中也可以看出,传给JobDeatailBean的属性中只是jobClass,而不是一个具体的job实例。
3.Trigger
Trigger描述触发job执行的时间规则。有SimpleTrigger和CronTrigger这两个子类。SimpleTrigger主要用于触发一次或者固定频率触发;CronTrigger则可以通过Cron表达式定义各种复杂的触发时间,如每周一上午10点执行、每月的最后一个星期日执行。这个跟linux中的cron定时任务是一样的,具体的定义规则,自己google吧。
4.Calendar
有时每月的最后一个星期日执行任务,但是如果遇到中秋节、春节就不执行,这种需求就用到了Calendar。也就是说,从tigger中排除若干个特殊日期,使用的就是Calendar。一个trigger可以和多Calendar配合使用。
5.Scheduler
Scheduler代表一个Quartz独立运行的容器,Trigger和JobDetail可以注册到Scheduler中,两者在Scheduler中拥有各自的组和名称, 组和名称是在Scheduler中定位一个对象的依据。
框架就先写到这里吧,下篇写一个完整的例子。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值