隐锋的BLOG
ASP,.net开发

 

quartz数据库方式与web工程整合

      这两天在项目中有一个任务,需要灵活配置调度任务时间,并能自由启动或停止调度。

      有关调度的实现我就想到了quartz这个开源调度组件,自己写这样一个类似的东西感觉还有一定难度,其实主要是自己在线程方面的经验、知识不足,有一种恐惧感,好在有开源的解决方案。

      以前在web项目中配置过quartz,比如:每天凌晨几点定时运行一个程序,这只要在工程中的spring配置文件中配置好spring整合quartz的几个属性就好。顺便总结一下:

     

 

Xml代码 复制代码
  1. <bean id="sfb" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
  2.     <property name="triggers">  
  3.         <list>  
  4.             <ref local="bjcronTrigger" />  
  5.         </list>  
  6.     </property>  
  7. </bean>  
  8. <bean id="bjcronTrigger"  
  9.     class="org.springframework.scheduling.quartz.CronTriggerBean">  
  10.     <property name="jobDetail">  
  11.         <ref bean="miJobDetail" />  
  12.     </property>  
  13.     <property name="cronExpression">  
  14.         <value>0 0/5 1 * * ? *</value>  
  15.     </property>  
  16. </bean>  
  17. <bean id="miJobDetail"  
  18.     class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
  19.     <property name="targetObject">  
  20.         <ref bean="JobMethodBean" />  
  21.     </property>  
  22.     <property name="targetMethod">  
  23.         <value>taskTimePoll</value>  
  24.     </property>  
  25. </bean>  
  26. <bean id="JobMethodBean"  
  27.     class="com.yinbo.entrust.service.impl.JobMethodBean">  
  28.     <property name="tasktimepollManager">  
  29.         <ref bean="tasktimepollManager" />  
  30.     </property>  
  31.     <property name="workFlowManager">  
  32.         <ref bean="workFlowManager" />  
  33.     </property>  
  34. </bean>  
  35. <!-- 任务定时轮询 -->  
  36. <bean id="tasktimepollDao"  
  37.     class="com.mycompany.entrust.dao.impl.TasktimepollDaoHibernate"  
  38.     autowire="byName" />  
  39. <bean id="tasktimepollManager"  
  40.     class="com.mycompany.entrust.service.impl.TasktimepollManagerImpl">  
  41.     <property name="tasktimepollDao" ref="tasktimepollDao" />  
  42. </bean>  

 

        这种配置就是对quartz的一种简单的使用了,调度任务会在spring启动的时候加载到内存中,按照bjcronTrigger中定义的crontrigger定义的时间按时触发调度任务。但是这是quartz使用“内存”方式的一种配置,也比较常见,当然对于不使用spring的项目,也可以单独整合quartz。方法也比较简单,可以从quartz的doc中找到配置方式,或者看一下《Quartz Job Scheduling Framework 》(附件中可下载)这本书中的例子。

         但是对于想持久化调度任务的状态,并且灵活调整调度时间的方式来说,上面的内存方式就不能满足要求了,正如本文开始我遇到的情况,需要采用数据库方式集成quartz,这部分集成其实在《Quartz Job Scheduling Framework 》中也有较为详细的介绍,当然doc文档中也有,但是缺乏和spring集成的实例,我在这里把我在项目中在spring配置quartz数据库存储方式的配置也写一下:

 

Xml代码 复制代码
  1.               <bean id="scheduler"  
  2.     class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
  3.     <property name="dataSource">  
  4.         <ref bean="dataSource" />  
  5.     </property>  
  6.     <property name="schedulerName" value="Mscheduler" />  
  7.     <property name="configLocation">  
  8.         <ref local="configLocationResource" />  
  9.     </property>  
  10.     <property name="applicationContextSchedulerContextKey"  
  11.         value="applicationContextKey" />  
  12.     <property name="autoStartup" value="false" />  
  13. </bean>  
  14.   
  15. <bean id="configLocationResource"  
  16.     class="org.springframework.core.io.ClassPathResource">  
  17.     <constructor-arg value="quartz.properties"  
  18.         type="java.lang.String">  
  19.     </constructor-arg>  
  20. </bean>  
  21.   
  22. <bean id="schedulerService"  
  23.     class="cn.mycompany.mdms.scheduler.service.SchedulerServiceImpl">  
  24.     <property name="scheduler">  
  25.         <ref bean="scheduler" />  
  26.     </property>  
  27. </bean>  
  28.   
  29. <!-- 自动扫描作业服务类 -->  
  30. <bean id="monitorDirService"  
  31.     class="cn.mycompany.mdms.monitordir.MonitorDirService">  
  32.     <property name="adm">  
  33.         <ref bean="IMAdapterManager" />  
  34.     </property>  
  35. </bean>  

 

        属性说明:

        dataSource:项目中用到的数据源,里面包含了quartz用到的12张数据库表;

        schedulerName:调度器名,我理解主要在调度集群的时候会有用,如果出现多个调度器实例的时候可以用来进行区分,详细看一下《Quartz Job Scheduling Framework 》;

        configLocation:用于指明quartz的配置文件的位置,如果不用spring配置quartz的话,本身quartz是通过一个配置文件进行配置的,默认名称是quartz.properties,里面配置的参数在quartz的doc文档中都有介绍,可以调整quartz,我在项目中也用这个文件部分的配置了一些属性,代码如下:

 

Java代码 复制代码
  1. #============================================================================   
  2. # Configure Main Scheduler Properties     
  3. #============================================================================   
  4.   
  5. #org.quartz.scheduler.instanceName = Mscheduler   
  6. org.quartz.scheduler.instanceId = AUTO   
  7.   
  8. #============================================================================   
  9. # Configure ThreadPool     
  10. #============================================================================   
  11.   
  12. org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool   
  13. org.quartz.threadPool.threadCount = 3  
  14. org.quartz.threadPool.threadPriority = 5  
  15.   
  16. #============================================================================   
  17. # Configure JobStore     
  18. #============================================================================   
  19.   
  20. #org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore   
  21.   
  22. org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX   
  23. #org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate   
  24. org.quartz.jobStore.useProperties = true  
  25. #org.quartz.jobStore.dataSource = myDS   
  26. org.quartz.jobStore.tablePrefix = QRTZ_   
  27. org.quartz.jobStore.isClustered = false  
  28. org.quartz.jobStore.maxMisfiresToHandleAtATime=1  
  29. #============================================================================   
  30. # Configure Datasources     
  31. #============================================================================   
  32.   
  33. #org.quartz.dataSource.myDS.driver = com.ibm.db2.jcc.DB2Driver   
  34. #org.quartz.dataSource.myDS.URL = jdbc:db2://localhost:50000/db   
  35. #org.quartz.dataSource.myDS.user = db2   
  36. #org.quartz.dataSource.myDS.password = db2   
  37. #org.quartz.dataSource.myDS.maxConnections = 5  
  38.   
  39.   
  40.   
  41. #============================================================================   
  42. # Configure Plugins    
  43. #============================================================================   
  44.   
  45. #org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin   
  46.   
  47. #org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin   
  48. #org.quartz.plugin.jobInitializer.fileNames = jobs.xml   
  49. #org.quartz.plugin.jobInitializer.overWriteExistingJobs = true  
  50. #org.quartz.plugin.jobInitializer.failOnFileNotFound = true  
  51. #org.quartz.plugin.jobInitializer.scanInterval = 10  
  52. #org.quartz.plugin.jobInitializer.wrapInUserTransaction = false  

 

 比如这里面有关数据源的配置部分我就屏蔽掉了,采用spring注入datasource的方式已经进行了配置;

     applicationContextSchedulerContextKey:

     是org.springframework.scheduling.quartz.SchedulerFactoryBean这个类中把spring上下文以key/value的方式存放在了quartz的上下文中了,可以用applicationContextSchedulerContextKey所定义的key得到对应的spring上下文;

      autoStartup:表示是否调度随工程启动自动启动,如果是false表示不自动启动,则需要调用scheduler.start()进行启动。

 

 

转自http://dayang2001911.javaeye.com/blog/248144

posted on 2010-05-25 19:41  糊涂隐锋  阅读(7697)  评论(0编辑  收藏  举报