Spring对Quartz的支持 任务调度,定时器

  • Post author:
  • Post category:其他



Spring对任务调度的支持有两种不同的形式:基于JDK Timer和基于Quartz。

我主要说基于Quartz方面的一个例子。


主要思路:定义任务—->定义调度工作任务—->设置触发器(触发的条件)—->启动job


)



1.定义任务


此处定义的是自定义的任务类,属于业务层范畴。例如:任务类  com.xxx.xxx




在applicationContext.xml中如下配置:

<span style="font-size:14px;"><bean id="testDemo"
		class="com.xxx.xxx"></span>



2.定义调度工作任务


Spring通过JobDetailBean,MethodInvokingJobDetailFactoryBean实现对任务调度的定义。


JobDetailBean,

MethodInvokingJobDetailFactoryBean都

是spring对定义的任务类进行调度的代理,但二者有明显的区别。







第一种:JobDetailBean方式。



任务是无状态的,导致多个线程并发执行,产生业务重复操作。


此方式需要设置 jobClass(即你的任务类)和jobDataAsMap(任务类中注入的属性或参数),例如:


在applicationContext.xml中如下配置:

<span style="font-size:14px;"><bean id="autoSendEmailJobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">  
    <property name="jobClass">  
        <value>com.xxx.xxx</value>  
    </property>  
    <property name="jobDataAsMap">  
        <map>    
            <entry key="userService">  
                <ref bean="userService" />  
            </entry>                
        </map>  
    </property>  
</bean></span>



第二种:MethodInvokingJobDetailFactoryBean方式。


该方式指定concurrent设为

false

,多个job不会并发运行,默认concurrent为

true。


此方式需要设置“targetObject”(任务类)和“targetMethod”(任务类中的方法),例如:



在applicationContext.xml中如下配置:

<bean id="syncSponsorJob"
		class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject">
			<ref bean="webServiceSponsor" />
		</property>
		<property name="targetMethod">
			<value>getSponsorInfo</value>
		</property>
		<property name="arguments">
			<list>
				<value>null</value>
			</list>
		</property>
	</bean>



3.设置触发器


需要设置jobDetail(2中定义的任务的调度) 和cronExpression(设置触发时间)




在applicationContext.xml中如下配置:

<bean id="syncSponsorJobCronTrigger"
	   class="org.springframework.scheduling.quartz.CronTriggerBean">
	   <property name="jobDetail">
	    <ref bean="syncSponsorJob" />
	   </property>
	   <property name="cronExpression">
	    <value>0 08 02 * * ?</value>
	   </property>
	</bean>


触发时间的定义如下:


a.触发时间格式:【秒】【分】【时】【日】【月】【周】【年】


b.常用的通配符:


* 表示所有值。例如,在分得字段上设置 “*”,表示每分钟都执行。


?表示不指定值。例如,公司要在每月的10号发放工资,但不关心是周几,此时需要在【周】的位置设置“?”,具体设置为 0 0 0 10 * ?


– 表示区间。例如,在小时位置设置8-10,表示8点,9点,10点都会执行。


,表示指定多个值。例如,在小时的位置指定 8,10,17 表示在8点,10点,17点的时候执行。


/ 表示递增触发。例如,在分得位置设置 1/10,表示从1分开始,每隔10分钟执行一次。



4.启动JOB


可以启动多个job,例如


在applicationContext.xml中如下配置:


<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<!--  
				<ref bean="updateDeptJobCronTrigger" />
				<ref bean="updateJobCodeJobCronTrigger" />
				<ref bean="updateUserJobCronTrigger" />
				-->
				<ref bean="syncEhrJobCronTrigger" />
				<ref bean="syncSponsorJobCronTrigger" />
				<ref bean="syncTradeJobCronTrigger" />
				<ref bean="syncAgingStatiSticsJobCronTrigger" />
				<ref bean="autoCalcJobCronTrigger" />
				<ref bean="changeOrderStatusJobCronTrigger" />
			</list>
		</property>
	</bean>











版权声明:本文为iYCLH原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。