Spring版本:3.2.13.RELEASE
quartz版本:2.2.1
1. 基本配置
(1)配置自己写的任务类
<bean id="testTimer" class="org.linkscholar.biz.timer.TestTimer" />
(2)配置JobDetail
<bean id="testJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject"> <ref bean="testTimer"/> </property> <property name="targetMethod"> <value>scan</value> </property> </bean>
targetObject指定任务对象,targetMethod指定对象执行方法
(3)配置触发器
<bean id="testCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"> <ref bean="testJobDetail" /> </property> <property name="cronExpression"> <value>0 0/1 * * * ?</value> </property> </bean>
这里 0 0/1 * * * ? 表示每一分钟执行一次,关于调用时间的具体配置可以参照
http://jingyan.baidu.com/article/0f5fb099cc244d6d8234ea6b.html
(4)配置总管理类
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false"> <property name="triggers"> <list> <ref local="testCronTrigger" /> </list> </property> </bean>
lazy-init="false"表示容器启动就开始执行调度任务, 这里可以配置多个触发器,可以统一管理
2. 出现的问题
按照上述配置后,写了Junit测试运行,发现出现错误:
(1)
Cannot find class [org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean] for bean with name
这个异常就是上面这个类找不到,开始我到spring-context.jar中去找,虽然有org.springframework.scheduling这个包,但是却没有quartz,后来上网查了好久才知道,上面这个类在spring-contex-support这个包中(以前spring用一个jar,后来分成了多个jar包),引入进来就对了。
(2)
解决了上面的问题后,又出现一个新的错误:
java.lang.IncompatibleClassChangeError: class org.springframework.scheduling.quartz.CronTriggerBean has interface org.quartz.CronTrigger as super class
这是因为版本不兼容引起的,解决的办法是:
1. 降低quartz到1.x版本
2. 根据spring的建议将原来的xxxTriggerBean替换成xxxTriggerFactoryBean,这里就是将配置中的第三步配置触发器类CronTriggerBean换成CronTriggerFactoryBean:
<bean id="testCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail"> <ref bean="testJobDetail" /> </property> <property name="cronExpression"> <value>0 0/1 * * * ?</value> </property> </bean>
(3)
解决了上面两个问题后,发现又有错误:
Table 'database.qrtz_locks' doesn't exist
这个错误看起来匪夷所思。。。
参考:
http://blog.sina.com.cn/s/blog_6151984a0100o42e.html
SchedulerFactoryBean试图访问数据库获取quartz的一些管理表信息,自然访问数据库时需要注入dataSource bean,当缺省autowire为no,则没有dataSource bean被注入,quartz会认为项目没连数据库,会BYPASS这个访问管理表的功能. 当你配置了default-autowire=byName时,dataSource bean被自动注入,这时quartz认为项目既然能连到数据库,就想当然的认为对应的那些表一定存在,没找到时就出异常.
解决办法:
1. 去掉default-autowire=byName(这种方法估计不是很愿意,得损失很多便利)
2. 在数据库中创建相应的数据表(这种需要创建很多表,而且建这些表可能我们暂时也用不到)
3. 在SchedulerFactoryBean这个bean配置中关掉autoware,加入autorware=“no”(这个解决方法好!):
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false" autoware="no"> <property name="triggers"> <list> <ref local="testCronTrigger" /> </list> </property> </bean>
相关推荐
Spring中Quartz任务调度器cronexpression配置说明
spring+quartz任务调度代码版
里面包含了两个工程项目: 1.Java project工程(含jar包,JDK1.6)。 是spring+quartz的任务调度实例。 2.Java web工程(含jar包,JDK1.7)。 spring+mybatis+quartz任务调度实例
spring任务调度(Quartz )非常基础,
Spring Quartz 任务调度实例 可直接运行 可应用服务器启动调用 也可main入口调用 主要用于打jar包用
spring整合quartz定时任务调度..........
Spring+Quartz实现任务调度的小例子.本来不要资源分的,可是CSDN发布资源最低要求填写分值为1分,没办法了。
Spring整合任务调度框架Quartz,本文档详细介绍了Spring整合任务调度框架Quartz,希望可以帮助学习者
该资源描述了用spring+quartz搭建的环境来管理任务调度的基本配置
Quartz + spring简单配置多个任务调度 spring配置文件 简单配置
spring quartz java任务调度 完整 可执行
Spring Quartz 定时调度任务,带中文注解与jar文件,导入项目即可直接运行。
用到了spring的任务调度 ,动手写了个demo
Spring+Quartz定时调度jar包和文档
schedule-job, 基于Spring Boot Quartz 的分布式任务调度系统
Quartz任务调度器与spring整合,做项目的时候常听测试说谁在起着quartz,也不知道是啥,问了下同事,就是定时去执行某些任务的,刚好bug比较少,学习了一下~
使用mysql 可运行的完项目 功能: 定时器运行/停止、 更改运行周期、动态增加定时器。
3、调度中心HA(中心式):调度采用中心式设计,“调度中心”基于集群Quartz实现,可保证调度中心HA; 4、执行器HA(分布式):任务分布式执行,任务"执行器"支持集群部署,可保证任务执行HA; 5、任务Failover:...
Spring实现任务调度.ppt Spring实现任务调度_代码演示 quartz-all-1.6.1.jar
实现了spring配置比较流行的任务调度操作,java timer 和 quartz俩种方式 并且有注释描述。