简介
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触发
Quartz定时任务实践
本文介绍如何使用Quartz定时任务框架结合Spring实现计划任务。详细解释了Job/JobDetail、Trigger和Scheduler的概念,并提供了配置示例,包括MethodInvokingJobDetailFactoryBean和JobDetailBean的用法。
3003

被折叠的 条评论
为什么被折叠?



