Quartzspring
Quartz是一个彻底由Java编写的开源做业调度框架,为在Java应用程序中进行做业调度提供了简单却强大的机制。Quartz容许开发人员根据时间间隔来调度做业。它实现了做业和触发器的多对多的关系,还能把多个做业与不一样的触发器关联。简单地建立一个org.quarz.Job接口的Java类,Job接口包含惟一的方法execute()。在Job接口实现类里面,添加须要的逻辑到execute()方法中。配置好Job实现类并设定好调度时间表,Quartz就会自动在设定的时间调度做业执行execute()。并发
Spring与Quartz框架
Spring很好的封装了Quartz的细节,先介绍Spring建立JobDetail的方式,这里仅介绍经过透明的使用Quartz达到定时任务开发的目的。spa
经过配置Spring的任务调度抽象层简化了任务调度,在Quartz的基础上提供了更好的调度对象。Spring使用Quartz框架来完成任务调度,建立Quartz的做业Bean(JobDetail),利用MethodInvokingJobDetailFactoryBean工厂Bean包装普通的Java对象(即Job类),建立Job类,无须继承父类,直接配置MethodInvokingJobDetailFactoryBean便可。但须要指定一下两个属性。code
targetObject:指定包含任务执行体的Bean实例。对象
targetMethod:指定将指定Bean实例的该方法包装成任务的执行体。blog
例子以下:继承
<bean id="Synch21MessageJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="synch21MessageDisposeTask"/> <property name="targetMethod" value="synch21Message"/> <property name="concurrent" value="false"/> </bean>
concurrent属性是为了防止并发或者死锁现象,true则为同时发生,对于相同的JobDetail,当指定多个Trigger时, 极可能第一个job完成以前,第二个job就开始了。定concurrent设为false,多个job不会并发运行,第二个job将不会在第一个job完成以前开始。接口
下面介绍触发器,这里配置为简单的触发器。进程
<bean id="Synch21MessageTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <property name="jobDetail" ref="Synch21MessageJob"/> <property name="startDelay" value="10000"/> <property name="repeatInterval" value="3000"/> </bean>
触发时长间隔和开始延时都在这里进行设置。
另外还有一种触发器CronTrigger,CronTrigger可以提供复杂的触发器表达式的支持。CronTrigger是基于Unix Cron守护进程,它是一个调度程序,支持简单而强大的触发器语法。
<bean id="receivedCaseCountJobTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="receivedCaseCountJob" />
<!-- 指定Cron表达式:周一到周五7点、12点执行调度 -->
<property name="cronExpression" value="0 0 7,12 ? * MON-FRI"/>
</bean>
下面还要配置调度器,须要将全部的触发器都配置在list里面
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="Synch21MessageTrigger"/> <ref bean="receivedCaseCountJobTrigger" /> </list> </property> </bean>
这样,只要实现synch21MessageDisposeTask对应的类中synch21Message方法就好了,系统会根据配置定时触发该方法。
最后须要注意的是