`

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

阅读更多

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,我在项目中也用这个文件部分的配置了一些属性,代码如下:

#============================================================================
# Configure Main Scheduler Properties  
#============================================================================

#org.quartz.scheduler.instanceName = Mscheduler
org.quartz.scheduler.instanceId = AUTO

#============================================================================
# Configure ThreadPool  
#============================================================================

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 3
org.quartz.threadPool.threadPriority = 5

#============================================================================
# Configure JobStore  
#============================================================================

#org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
#org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties = true
#org.quartz.jobStore.dataSource = myDS
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.isClustered = false
org.quartz.jobStore.maxMisfiresToHandleAtATime=1
#============================================================================
# Configure Datasources  
#============================================================================

#org.quartz.dataSource.myDS.driver = com.ibm.db2.jcc.DB2Driver
#org.quartz.dataSource.myDS.URL = jdbc:db2://localhost:50000/db
#org.quartz.dataSource.myDS.user = db2
#org.quartz.dataSource.myDS.password = db2
#org.quartz.dataSource.myDS.maxConnections = 5



#============================================================================
# Configure Plugins 
#============================================================================

#org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin

#org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin
#org.quartz.plugin.jobInitializer.fileNames = jobs.xml
#org.quartz.plugin.jobInitializer.overWriteExistingJobs = true
#org.quartz.plugin.jobInitializer.failOnFileNotFound = true
#org.quartz.plugin.jobInitializer.scanInterval = 10
#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()进行启动。

 

 

12
0
分享到:
评论
3 楼 wuyechun 2014-05-26  
可以发发代码吗?实在没有头绪。3Q
2 楼 nbaertuo 2008-12-09  
如果在集群环境下,如何保证一个任务不被多台机器重复执行?
1 楼 wangdj 2008-10-21  
你好,我是http://www.iteye.com/problems/5636
谢谢你的回复,我还没看你的这篇文章呢,看完这篇文章无论对我是否有用,都是要谢谢你的,你就是我的启蒙老师,支持你!!!

相关推荐

    QuartzAPI以及例子

    Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中...整合了 Quartz.NET的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业.

    Spring Quartz Job 集群 终极解决方案

    但只能让其中一台服务器的job执行,一台服务器挂了,另一台还能继续执行job,通过网上查找资料,都是java工程的方式,不好部署并测试,经过二天辛苦整合,终于整理成一个单spring web方式的工程,连接oracle数据库用...

    spring-Quartz(作业调度)

    整合了 Quartz 的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业。虽然可以通过属性文件(在属性文件中可以指定 JDBC 事务的数据源、全局作业和/或触发器侦听器、插件、线程池,以及更多)配置 ...

    jsp+ssm+mysql实现的零食商城系统源码+数据库文件+项目开发文档(60+页)

    1)使用 Spring + SpringMVC + MyBatis + Redis + RabbitMQ + Quartz + Bootstrap 进行项目整合开发 2)使用 Redis 实现购物车功能和商品信息的数据缓存功能,提高系统的响应速度并降低数据库的访问压力 3)使用 ...

    quartz1.6.5+Hibernate+Spring

    quartz1.6.5 整合 Hibernate、Spring,支持各种数据库;本例支持同时运行多个任务,每个任务调用的方法和时间都不一样;本例支持Oracle11g,内附数据库脚本;

    Spring.3.x企业应用开发实战(完整版).part2

    11.6 以OO方式访问数据库 11.6.1 使用MappingSqlQuery查询数据 11.6.2 使用SqlUpdate更新数据 11.6.3 使用StoredProcedure执行存储过程 11.6.4 SqlFunction类 11.7 小结 第12章 整合其他ORM框架 12.1 Spring整合ORM...

    Spring3.x企业应用开发实战(完整版) part1

    11.6 以OO方式访问数据库 11.6.1 使用MappingSqlQuery查询数据 11.6.2 使用SqlUpdate更新数据 11.6.3 使用StoredProcedure执行存储过程 11.6.4 SqlFunction类 11.7 小结 第12章 整合其他ORM框架 12.1 Spring整合ORM...

    Spring+3.x企业应用开发实战光盘源码(全)

     第16章:有别于一般书籍的单元测试内容,本书以当前最具实战的JUnit4+Unitils+ Mockito复合测试框架对如何测试数据库、Web的应用进行了深入的讲解。  第17章:以一个实际的项目为蓝本,带领读者从项目需求分析、...

    xmljava系统源码-iBase4J-SpringBoot:JAVA分布式快速开发平台:Spring,SpringBoot,SpringMV

    系统包括4个子系统:系统管理Service、系统管理Web、业务Service、业务Web。 系统管理:包括用户管理、权限管理、数据字典、系统参数管理等等。 业务相关:您的业务开发。 可以无限的扩展子系统,子系统之间使用...

    《iPhone开发实战》.(Christopher Allen).pdf

     本书全面探讨了 iphone平台的两种编程方式 ——web开发和 sdk编程。全书结合示例对这两种编程方式的基本流程、基本原理和基本原则给出了详细而通俗的讲解。在 web开发方面,分别介绍了三个 iphone web库,即 ...

    spring in action英文版

     4.4 用Spring整合Hibernate  4.4.1 Hibernate概览  4.4.2 管理Hibernate资源  4.4.3 用HibernateTemplate访问Hibernate  4.4.4 HibernateDaoSupport的子类  4.5 Spring和JDO  4.5.1 配置JDO ...

    陈开雄 Spring+3.x企业应用开发实战光盘源码.zip

     第16章:有别于一般书籍的单元测试内容,本书以当前最具实战的JUnit4+Unitils+ Mockito复合测试框架对如何测试数据库、Web的应用进行了深入的讲解。  第17章:以一个实际的项目为蓝本,带领读者从项目需求分析、...

    JavaFan 建站系统 v3.9.16.rar

    框架:struts2 spring3 hibernate4 freemarker2.3 mysql5 quartz flazr 1.系统内置了几套模块,可自由切换,通过修改WEB-INF\classes\spring-core.xml 文件的28行,现有可选的模版有:bbs、blogBaby、blogBlack...

    Java源码 SpringMVC Mybatis Shiro Bootstrap Rest Webservice

    项目Maven构建,真实大型互联网架构,做到高并发,大数据处理,整个项目使用定制化服务思想,提供模块化、服务化、原子化的方案,将功能模块进行拆分,可以公用到所有的...Web容器: Tomcat 6、7、 8 数据库: mysql

    iBase4J分布式系统-其他

    技术选型:核心框架:Sring boot + Spring Framework + Dubbo + ibase4j-common安全框架:Apache Shiro任务调度:Spring + Quartz持久层框架:MyBatis + MyBatis-Plus数据库连接池:Alibaba Druid缓存框架:Redis...

    spring-boot示例项目

    该项目包含helloworld(快速入门)、web(ssh项目快速搭建)、aop(切面编程)、data-redis(redis缓存)、quartz(集群任务实现)、shiro(权限管理)、oauth2(四种认证模式)、shign(接口参数防篡改重放)、encoder(用户...

    java开发常用jar包

    Sitemesh 是一个基于WEB页面的布局、装饰以及应用整合的开源框架。它能帮助我们在由大量页面构成的项目中创建一致的页面布局和外观,如一致的导航条,一致的 banner,一致的版权,等等。它不仅仅能处理动态的内容,...

    Eclipse开发分布式商城系统+完整视频代码及文档

    │ 06.ssm框架整合思路.avi │ 07.ssm框架整合.avi │ 08.测试工程.avi │ 打开必读.txt │ 淘淘商城第一天笔记.docx │ ├─02.第二天 │ 07.商品类目选择完成.avi │ 01.课程计划.avi │ 02.展示首页.avi │ 03....

    Spring攻略(第二版 中文高清版).part2

    7.6 使用RichFaces与Spring WebFlow协作 275 7.6.1 问题 275 7.6.2 解决方案 275 7.6.3 方法 275 7.7 小结 279 第8章 Spring @MVC 280 8.1 用Spring MVC开发简单的Web应用 280 8.1.1 问题 280 ...

Global site tag (gtag.js) - Google Analytics