QuartZ在Web项目中实现定时任务

一个原来写的SSH的Web项目,现在需要增加定时执行数据库查询的操作。一开始使用TimerTask实现的,但在测试过程中,发现时不时会莫名其妙的挂掉,网上查了一下,普遍反映是原生缺陷。
看了一些讨论帖后,决定放弃TimerTask,使用成熟的QuartZ来实现。
首先到官网下载最新版本的jar包:http://www.quartz-scheduler.org/,全部添加到项目中去,依赖的jar包有新版的spring-context-support和spring-beans,注意自行下载添加。
QuartZ配置和使用非常简单,正常写个普通类和方法,我用的DutyJob,再配置到xml文件中进行加载即可,配置如下:


	<bean id="dutyJob" class="logic.DutyJob">bean>

	<bean id="SpringQtzJobMethod0" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject"><ref bean="dutyJob">ref>property>
		<property name="targetMethod"><value>job0value>property>
	bean>
	<bean id="SpringQtzJobMethod1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject"><ref bean="dutyJob">ref>property>
		<property name="targetMethod"><value>job1value>property>
	bean>
	<bean id="SpringQtzJobMethod2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject"><ref bean="dutyJob">ref>property>
		<property name="targetMethod"><value>job2value>property>
	bean>
	<bean id="SpringQtzJobMethod3" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject"><ref bean="dutyJob">ref>property>
		<property name="targetMethod"><value>job3value>property>
	bean>

	<bean id="cronTriggerFactoryBean0" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
		<property name="jobDetail" ref="SpringQtzJobMethod0">property>
		<property name="cronExpression" value="0 20 8 * * ? *">property>
	bean>
	<bean id="cronTriggerFactoryBean1" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
		<property name="jobDetail" ref="SpringQtzJobMethod1">property>
		<property name="cronExpression" value="0 20 7 * * ? *">property>
	bean>
	<bean id="cronTriggerFactoryBean2" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
		<property name="jobDetail" ref="SpringQtzJobMethod2">property>
		<property name="cronExpression" value="0 0 11 * * ? *">property>
	bean>
	<bean id="cronTriggerFactoryBean3" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
		<property name="jobDetail" ref="SpringQtzJobMethod3">property>
		<property name="cronExpression" value="0 0 17 * * ? *">property>
	bean>

	<bean id="SpringJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref bean="cronTriggerFactoryBean0"/>
				<ref bean="cronTriggerFactoryBean1"/>
				<ref bean="cronTriggerFactoryBean2"/>
				<ref bean="cronTriggerFactoryBean3"/>
			list>
		property>
	bean>

这里需要注意的是,我一开始图省事,直接把配置写到applicationContext.xml中,执行时发现任务会重复执行2次,网上查了一下,得知可能为在项目启动时,web.xml和applicationContext.xml这2个配置文件都对QuartZ进行了加载,导致重复运行。
解决办法为把QuartZ单独写一个配置文件applicationContext-quartz.xml,然后在web.xml中增加对其的加载即可,我这里因为命名前面一致,所以直接加个*进行了匹配加载,如下:

  <context-param>
    <param-name>contextConfigLocationparam-name>
    <param-value>/WEB-INF/classes/applicationContext*.xmlparam-value>
  context-param>

你可能感兴趣的:(Web后端)