Spring+Quartz完成作业调度

简介

Quartz是一个Java的定时任务框架,使用它可以方便地实现计划任务,即在某个时间或是每隔一定时间运行一个任务。Quartz的核心是Job/JobDetail,Trigger和Scheduler。Job/JobDetail即要执行的任务,可以通过实现Job中的execute方法来指定任务的具体操作。Trigger描述出发Job执行的时间触发规则,用于控制一组Job的触发,包括SimpleTrigger和CronTrigger,后者支持一种描述触发时间和间隔的表达式语言。Scheduler代表一个Quartz 的独立运行容器,Trigger 和JobDetail可以注册到Schduler中,Schduler可以控制和管理触发器的启动和终止。

Spring的scheduling.quartz包中对Quartz框架进行了封装,使得开发时不用写任何Quartz和Spring的代码就可以实现定时任务。Spring通过JobDetailBean,MethodInvokingJobDetailFactoryBean实现Job的定义。后者更加实用,只需指定要运行的类,和该类中要运行的方法即可,Spring将自动生成符合Quartz要求的JobDetail。

 

实现

Step1:Job/JobDetail
方法一
:(MethodInvokingJobDetailFactoryBean)

<bean id="scheduledUploadJob" 
    class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
    <property name="targetObject" ref="storageService" />  
    <property name="targetMethod" value="batchUpload" />  
</bean> 

 
方法二:(JobDetailBean)

<bean id="libraryReminderJob"
    class="org.springframework.scheduling.quartz.JobDetailBean">
    <property name="jobClass">
      <value>org.santino.www.jobs.LibraryReminderJob</value>
    </property>
    <property name="jobDataAsMap">
      <map>
        <entry key="libraryService">
          <ref bean="libraryService" />
        </entry>
        <entry key="defaultCcAddress">
          <value></value>
        </entry>
      </map>
    </property>
</bean>

 

其中LibraryReminderJob必须具体化QuartzJobBean的抽象方法executeInternal,这个方法的实现内容也就是Job所要执行的操作。

 

Step2:Trigger
Quartz的两种Trigger也被封装成Spring的SimpleTruggerBean和CronTriggerBean。当仅仅需要触发一次或者以固定时间间隔周期执行,SimpleTrigger是最合适的选择;而CronTrigger则可以通过Cron表达式定义出各种复杂时间规则的调度方案;如每天早晨9:00执行,周一、周三、周五下午5:00执行等。
方法一:(SimpleTruggerBean)

<bean id="uploadJobTrigger"  
    class="org.springframework.scheduling.quartz.SimpleTriggerBean">  
    <property name="jobDetail" ref="scheduledUploadJob" />  
    <property name="startDelay" value="10000" />  
    <!-- Run every 5 minute -->  
    <property name="repeatInterval" value="300000" />  
</bean>

 

 

方法二:(CronTriggerBean)

<bean id="libraryReminderTrigger"  
    class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail">
      <ref bean="libraryReminderJob" />
    </property>
    <property name="cronExpression">
      <value>0 0 14 * * ?</value>
    </property>
</bean>

 


Step3:Scheduler:

<bean id="schedulerFactory"  
    class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
    <property name="triggers">  
        <list>  
            <ref bean="uploadJobTrigger" />  
            <ref bean="libraryReminderTrigger" />  
        </list>  
    </property>  
    <property name="autoStartup" value="false"/>  
</bean> 

 

附:cronExpresession格式:

字段 允许值 允许的特殊字符
秒 0-59 , - * /
分 0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / L C #
年(可选) 留空, 1970-2099 , - * /


表达式 意义
"0 0 12 * * ?" 每天中午12点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
"0 15 10 15 * ?" 每月15日上午10:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发

你可能感兴趣的:(spring,bean,框架,quartz,sun)