日期:2014-05-16 浏览次数:20586 次
quartz数据库方式与web工程整合
??????这两天在项目中有一个任务,需要灵活配置调度任务时间,并能自由启动或停止调度。
????? 有关调度的实现我就想到了quartz这个开源调度组件,自己写这样一个类似的东西感觉还有一定难度,其实主要是自己在线程方面的经验、知识不足,有一种恐惧感,好在有开源的解决方案。
????? 以前在web项目中配置过quartz,比如:每天凌晨几点定时运行一个程序,这只要在工程中的spring配置文件中配置好spring整合quartz的几个属性就好。顺便总结一下:
?????
<bean id="sfb" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref local="bjcronTrigger" /> </list> </property> </bean> <bean id="bjcronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"> <ref bean="miJobDetail" /> </property> <property name="cronExpression"> <value>0 0/5 1 * * ? *</value> </property> </bean> <bean id="miJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject"> <ref bean="JobMethodBean" /> </property> <property name="targetMethod"> <value>taskTimePoll</value> </property> </bean> <bean id="JobMethodBean" class="com.yinbo.entrust.service.impl.JobMethodBean"> <property name="tasktimepollManager"> <ref bean="tasktimepollManager" /> </property> <property name="workFlowManager"> <ref bean="workFlowManager" /> </property> </bean> <!-- 任务定时轮询 --> <bean id="tasktimepollDao" class="com.mycompany.entrust.dao.impl.TasktimepollDaoHibernate" autowire="byName" /> <bean id="tasktimepollManager" class="com.mycompany.entrust.service.impl.TasktimepollManagerImpl"> <property name="tasktimepollDao" ref="tasktimepollDao" /> </bean>
??????? 这种配置就是对quartz的一种简单的使用了,调度任务会在spring启动的时候加载到内存中,按照bjcronTrigger中定义的crontrigger定义的时间按时触发调度任务。但是这是quartz使用“内存”方式的一种配置,也比较常见,当然对于不使用spring的项目,也可以单独整合quartz。方法也比较简单,可以从quartz的doc中找到配置方式,或者看一下《Quartz Job Scheduling Framework 》(附件中可下载)这本书中的例子。
???????? 但是对于想持久化调度任务的状态,并且灵活调整调度时间的方式来说,上面的内存方式就不能满足要求了,正如本文开始我遇到的情况,需要采用数据库方式集成quartz,这部分集成其实在《Quartz Job Scheduling Framework 》中也有较为详细的介绍,当然doc文档中也有,但是缺乏和spring集成的实例,我在这里把我在项目中在spring配置quartz数据库存储方式的配置也写一下:
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> </property> <property name="schedulerName" value="Mscheduler" /> <property name="configLocation"> <ref local="configLocationResource" /> </property> <property name="applicationContextSchedulerContextKey" value="applicationContextKey" /> <property name="autoStartup" value="false" /> </bean> <bean id="configLocationResource" class="org.springframework.core.io.ClassPathResource"> <constructor-arg value="quartz.properties" type="java.lang.String"> </constructor-arg> </bean> <bean id="schedulerService" class="cn.mycompany.mdms.scheduler.service.SchedulerServiceImpl"> <property name="scheduler"> <ref bean="scheduler" /> </property> </bean> <!-- 自动扫描作业服务类 --> <bean id="monitorDirService" class="cn.mycompany.mdms.monitordir.MonitorDirService"> <property name="adm"> <ref bean="IMAdapterManager" /> </property> </bean>
??????? 属性说明:
??????? dataSource:项目中用到的数据源,里面包含了quartz用到的12张数据库表;
??????? schedulerName:调度器名,我理解主要在调度集群的时候会有用,如果出现多个调度器实例的时候可以用来进行区分,详细看一下《Quartz Job Scheduling Framework 》;
????????configLocation:用于指明quartz的配置文件的位置,如果不用spring配置quartz的话,本身quartz是通过一个配置文件进行配置的,默认名称是quartz.properties,里面配置的参数在quartz的doc文档中都有介绍,可以调整quartz,我在项目中也用这个文件部分的配置了一些属性,代码如下: