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()进行启动。
分享到:
相关推荐
Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中...整合了 Quartz.NET的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业.
但只能让其中一台服务器的job执行,一台服务器挂了,另一台还能继续执行job,通过网上查找资料,都是java工程的方式,不好部署并测试,经过二天辛苦整合,终于整理成一个单spring web方式的工程,连接oracle数据库用...
整合了 Quartz 的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业。虽然可以通过属性文件(在属性文件中可以指定 JDBC 事务的数据源、全局作业和/或触发器侦听器、插件、线程池,以及更多)配置 ...
1)使用 Spring + SpringMVC + MyBatis + Redis + RabbitMQ + Quartz + Bootstrap 进行项目整合开发 2)使用 Redis 实现购物车功能和商品信息的数据缓存功能,提高系统的响应速度并降低数据库的访问压力 3)使用 ...
quartz1.6.5 整合 Hibernate、Spring,支持各种数据库;本例支持同时运行多个任务,每个任务调用的方法和时间都不一样;本例支持Oracle11g,内附数据库脚本;
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...
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...
第16章:有别于一般书籍的单元测试内容,本书以当前最具实战的JUnit4+Unitils+ Mockito复合测试框架对如何测试数据库、Web的应用进行了深入的讲解。 第17章:以一个实际的项目为蓝本,带领读者从项目需求分析、...
系统包括4个子系统:系统管理Service、系统管理Web、业务Service、业务Web。 系统管理:包括用户管理、权限管理、数据字典、系统参数管理等等。 业务相关:您的业务开发。 可以无限的扩展子系统,子系统之间使用...
本书全面探讨了 iphone平台的两种编程方式 ——web开发和 sdk编程。全书结合示例对这两种编程方式的基本流程、基本原理和基本原则给出了详细而通俗的讲解。在 web开发方面,分别介绍了三个 iphone web库,即 ...
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 ...
第16章:有别于一般书籍的单元测试内容,本书以当前最具实战的JUnit4+Unitils+ Mockito复合测试框架对如何测试数据库、Web的应用进行了深入的讲解。 第17章:以一个实际的项目为蓝本,带领读者从项目需求分析、...
框架:struts2 spring3 hibernate4 freemarker2.3 mysql5 quartz flazr 1.系统内置了几套模块,可自由切换,通过修改WEB-INF\classes\spring-core.xml 文件的28行,现有可选的模版有:bbs、blogBaby、blogBlack...
项目Maven构建,真实大型互联网架构,做到高并发,大数据处理,整个项目使用定制化服务思想,提供模块化、服务化、原子化的方案,将功能模块进行拆分,可以公用到所有的...Web容器: Tomcat 6、7、 8 数据库: mysql
技术选型:核心框架:Sring boot + Spring Framework + Dubbo + ibase4j-common安全框架:Apache Shiro任务调度:Spring + Quartz持久层框架:MyBatis + MyBatis-Plus数据库连接池:Alibaba Druid缓存框架:Redis...
该项目包含helloworld(快速入门)、web(ssh项目快速搭建)、aop(切面编程)、data-redis(redis缓存)、quartz(集群任务实现)、shiro(权限管理)、oauth2(四种认证模式)、shign(接口参数防篡改重放)、encoder(用户...
Sitemesh 是一个基于WEB页面的布局、装饰以及应用整合的开源框架。它能帮助我们在由大量页面构成的项目中创建一致的页面布局和外观,如一致的导航条,一致的 banner,一致的版权,等等。它不仅仅能处理动态的内容,...
│ 06.ssm框架整合思路.avi │ 07.ssm框架整合.avi │ 08.测试工程.avi │ 打开必读.txt │ 淘淘商城第一天笔记.docx │ ├─02.第二天 │ 07.商品类目选择完成.avi │ 01.课程计划.avi │ 02.展示首页.avi │ 03....
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 ...