您的位置:首页 > 编程语言 > Java开发

spring结合quartz实现定时

2010-09-12 08:36 246 查看
使用quartz能很方便地实现任务调度,spring框架加入了对quartz的支持,使得在web应用中实现定时任务变得很方便。
使用之前,需要在项目中引入quartz的jar包,要注意quartz和spring版本的匹配,我使用的是quartz1.6.2,spring是2.0.7。
1. spring中涉及quartz的配置:
<!-- 配置quartz调度,指定加载哪些触发器-->
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="sendEvaDataTrigger" />
</list>
</property>
</bean>

<!-- 配置quartz的触发器,指定该触发器触发的条件,以及该触发器加载哪些job-->
<bean id="sendEvaDataTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="sendEvaDataJobDetail" />
</property>
<!-- 59秒 59分 23时 每天 每月 不指定星期 -->
<property name="cronExpression" value="59 59 23 * * ?" />
</bean>
<!-- 配置quartz的任务,指定该任务执行哪一个bean的哪一个方法-->
<bean id="sendEvaDataJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="sendEvaDataJob" />
<property name="targetMethod" value="sendEvaDataEveryDay" />
</bean>
<!-- 配置需要定时执行的spring bean-->
<bean id="sendEvaDataJob" class="com.euvnet.ccc.common.SendEvaDataJobImpl">
<property name="agentEvaluateManage" ref="agentEvaluateManage"></property>
<property name="orgRemoteConfig" ref="orgRemoteConfig"></property>
</bean>
在配置时,考虑到quartz的特殊性,可以将这些配置单独放在一个配置文件中,这样在以后修改比较方便。
2. 注意事项
quartz有两种方式记录需要管理调度的job,一种是内存方式,一种是数据库方式,如果
spring中配置的数据源id为“dataSource”并且bean加载方式为自动装载,spring加载quartz时,会强制将quartz置为
数据库方式。解决方法一个是修改数据源id的名称,另外一个是关闭spring对bean的加载方式(因此把quartz相关的配置写在一个配置文件中还
是比较方便些)。
3. cronExpression格式说明
表达式: Seconds Minutes Hours Day-of-month Month Day-of-Week Year
说明:
表达式由6个或7个字符串组成,字符之间用空格分隔;前6个为必选项,year为可选项;
字符串的取值不区分大小写;
允许的值和特殊字符可单独使用或组合使用;
特殊符号:
星号(*)可以用来代表所有有效的值。譬如,月份值中的星号意味着在满足其它制约条件后每月都触发。
整数间的短线(-)指定一个整数范围。譬如,1-4 意味着整数 1、2、3、4。
用逗号(,)隔开的一系列值指定一个列表。譬如,3, 4, 6, 8 标明这四个指定的整数。
正斜线(/)可以用来指定间隔频率。在范围后加上 / 意味着在范围内可以跳过 integer。譬如,0-59/2 可以用来在分钟字段定义每两分钟。间隔频率值还可以和星号一起使用。例如,*/3 的值可以用在月份字段中表示每三个月触发一次。
问号(?)表示不指定任何值,主要用于day of month 和day of week,当指定其中一个值的时候,另一个设置为问号,避免前后不一致。
L表示最后一天, 主要用于day of month 和day of week,每月的最后一天,每周的最后一天,用于day of month 时只能单独使用,用于day of week时可以组合使用,例如6L, 表示指定月的最后一个星期五.
W用于day of month, 表示离指定日期最近的工作日(周一至周五),
例如6W,如果这个月的第6天为周六,则表示周五(这个月的第5天);如果第6天为周日,则表示周一(这个月的第7天);如果第6天为工作日,则为当日;
如果按正常推算的日期为上月或下月,则在本月内查找最近的工作日;
LW组合使用表示这个月的最后一个工作日;
#用于day of week, #号后面跟数字n表示本月的第n个X., 例如6#3 表示指定月的第三个星期五;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: