Quartz任务调度

   Quart可以通过两种方式来调度程序:一是使用Spring提供的MethodInvokingJobDetailFactoryBean代理类,Quartz通过改代理类直接调度任务类的某个函数;二是任务类继承并实现Quartz接口,Quartz通过该接口进行调度。
     如果采用第一种方式,即由Quartz直接调度任务类的某个接口,那么,业务类是不必进行任何修改的。我们的业务类大概如下

applicationContext-quartz-method-simple.xml配置文件写法如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr"
xsi:schemaLocation="http://www.springframework.org/schema/beans
        classpath:/spring/schema/spring-beans-3.0.xsd
        http://www.springframework.org/schema/tx
        classpath:/spring/schema/spring-tx-3.0.xsd
        http://www.springframework.org/schema/jee
        classpath:/spring/spring-jee-3.0.xsd
        http://www.springframework.org/schema/context
        classpath:/spring/schema/spring-context-3.0.xsd
        http://www.directwebremoting.org/schema/spring-dwr
        classpath:/spring/schema/spring-dwr-3.0.xsd"
default-lazy-init="true">

<description>Quartz的本地simple式执行任务配置</description>

<bean id="localQuartzScheduler"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean"
lazy-init="false">
<!-- Triggers集成 -->
<property name="triggers">
<list>
<!-- 加载任务调度器(可以有多个) -->
<ref bean="scanTrigger" />
</list>
</property>
<!-- Quartz配置 -->
<property name="quartzProperties">
<props>
<prop key="org.quartz.threadPool.threadCount">5</prop>
</props>
</property>
<!-- 启动时延期3秒开始任务 -->
<property name="startupDelay" value="3" />
</bean>

<bean id="scanTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail">
<!-- 需要触发的任务bean -->
<ref bean="simpleJobDetail" />
</property>
<!-- 启动时延期毫秒数执行任务 -->
<property name="startDelay">
<value>10000</value>
</property>
<!-- 每次执行间隔的毫秒数 -->
<property name="repeatInterval">
<value>60000</value>
</property>
</bean>

<!-- 定义需调度的任务 -->
<bean id="simpleJobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 普通类 -->
<property name="targetObject" ref="sysParamUpdateJob" />
<!-- 普通类中某个(value)方法执行定时任务 -->
<property name="targetMethod" value="updateFromDB" />
<!-- 同一任务在前一次执行未完成而Trigger时间又到时是否并发开始新的执行, 默认为true. -->
<property name="concurrent" value="false" />
</bean>


<!-- 被Cron执行的普通Spring Bean -->
<bean id="sysParamUpdateJob" class="cn.net.inch.system.task.SysParamUpdateJob"/>

</beans>到此处结束


当指定特定时间开启任务调度时也可以如下写:
<bean name="scanTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">  
      <property name="jobDetail" ref="simpleJobDetail"/>//触发哪个任务  
      <property name="cronExpression" value="0 0 2 * * ?"/>//何时触发任务:每天2点 
    </bean>

CronTrigger 的用途更广,相比基于特定时间间隔进行调度安排的 SimpleTrigger,CronTrigger 主要适用于基于日历的调度安排。例如:每星期二的 16:38:10 执行,每月一号执行,以及更复杂的调度安排等。

CronTrigger 同样需要指定 start-time 和 end-time,其核心在于 Cron 表达式,由七个字段组成:

Seconds
Minutes
Hours
Day-of-Month
Month
Day-of-Week
Year (Optional field)


举例如下:

创建一个每三小时执行的 CronTrigger,且从每小时的整点开始执行:

0 0 0/3  * * ?


创建一个每十分钟执行的 CronTrigger,且从每小时的第三分钟开始执行:

0 3/10 * * * ?


创建一个每周一,周二,周三,周六的晚上 20:00 到 23:00,每半小时执行一次的 CronTrigger:

0 0/30 20-23 ? * MON-WED,SAT


创建一个每月最后一个周四,中午 11:30-14:30,每小时执行一次的 trigger:

0 30 11-14/1 ? * 5L


解释一下上述例子中各符号的含义:

首先所有字段都有自己特定的取值,例如,Seconds 和 Minutes 取值为 0 到 59,Hours 取值为 0 到 23,Day-of-Month 取值为 0-31, Month 取值为 0-11,或者 JAN,FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC,Days-of-Week 取值为 1-7 或者 SUN, MON, TUE, WED, THU, FRI, SAT。每个字段可以取单个值,多个值,或一个范围,例如 Day-of-Week 可取值为“MON,TUE,SAT”,“MON-FRI”或者“TUE-THU,SUN”。

通配符 * 表示该字段可接受任何可能取值。例如 Month 字段赋值 * 表示每个月,Day-of-Week 字段赋值 * 表示一周的每天。

/ 表示开始时刻与间隔时段。例如 Minutes 字段赋值 2/10 表示在一个小时内每 20 分钟执行一次,从第 2 分钟开始。

? 仅适用于 Day-of-Month 和 Day-of-Week。? 表示对该字段不指定特定值。适用于需要对这两个字段中的其中一个指定值,而对另一个不指定值的情况。一般情况下,这两个字段只需对一个赋值。

L 仅适用于 Day-of-Month 和 Day-of-Week。L 用于 Day-of-Month 表示该月最后一天。L 单独用于 Day-of-Week 表示周六,否则表示一个月最后一个星期几,例如 5L 或者 THUL 表示该月最后一个星期四。

W 仅适用于 Day-of-Month,表示离指定日期最近的一个工作日,例如 Day-of-Month 赋值为 10W 表示该月离 10 号最近的一个工作日。

# 仅适用于 Day-of-Week,表示该月第 XXX 个星期几。例如 Day-of-Week 赋值为 5#2 或者 THU#2,表示该月第二个星期四。

你可能感兴趣的:(spring,quartz)