最近要用到squartz来配置定时任务调度,网上搜了许多资料,也查了许多实例代码,大抵基本的调度代码都如下所示:
如下代码转自:http://blog.csdn.net/sambino/article/details/3934670,sambino的专栏。
1. javabean类
在Test.QuartzJob中package Test;
public class QuartzJob {
public void work() { System.out.println("Quartz的任务调度!!!"); } }2. 设置Spring的xml
我新建了一个applicationContext_quartz.xml,内容如下:<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="" xmlns:xsi="" xmlns:jee="" xsi:schemaLocation=" "> <!-- 要调用的工作类 --> <bean id="quartzJob" class="Test.QuartzJob"></bean> <!-- 定义调用对象和调用对象的方法 --> <bean id="jobtask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!-- 调用的类 --> <property name="targetObject"> <ref bean="quartzJob"/> </property> <!-- 调用类中的方法 --> <property name="targetMethod"> <value>work</value> </property> </bean> <!-- 定义触发时间 --> <bean id="doTime" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"> <ref bean="jobtask"/> </property> <!-- cron表达式 --> <property name="cronExpression"> <!-- 每隔10秒执行一次--> <value>0/10 * * * * ?</value> </property> </bean> <!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 --> <bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="doTime"/> </list> </property> </bean> </beans>3. 设置web.xml对Spring加载
<!-- 加载spring -->
<context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/classes/applicationContext*.xml </param-value> </context-param> <servlet> <servlet-name>context</servlet-name> <servlet-class> org.springframework.web.context.ContextLoaderServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet>注意:1.导入quartz-all-1.5.2.jar 下载 2.导入spring.jar(我用的是spring2.0以前的版本) 下载 如果不导入的话 org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean org.springframework.scheduling.quartz.CronTriggerBean org.springframework.scheduling.quartz.SchedulerFactoryBean spring中的这三个类找不到,spring不能正常加载,由于第一次使用Quartz,我就是当时忽略了这一点,浪费了很多时间来调配置,其实配置一点没有错误。 3. 你会问为什么用spring后就不用 quartz.properties quartz-jobsxml 这两个文件了么? 我回答:是的,它会自动找到quartz包中默认的这两个文件,如果你有特殊需要,也可以自己定义这两个文件。
附:quartz.properties# # Configure Main Scheduler Properties #
org.quartz.scheduler.instanceName = TestScheduler org.quartz.scheduler.instanceId = one
# # Configure ThreadPool #
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount = 5 org.quartz.threadPool.threadPriority = 4
# # Configure JobStore #
#org.quartz.jobStore.misfireThreshold = 5000
#org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
# =========================================================================== # Configure SchedulerPlugins =============================================== # =========================================================================== #org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingTriggerHistoryPlugin #org.quartz.plugin.triggHistory.triggerFiredMessage = Trigger {1}.{0} fired job {6}.{5} at: {4, date, HH:mm:ss MM/dd/yyyy} #org.quartz.plugin.triggHistory.triggerCompleteMessage = Trigger {1}.{0} completed firing job {6}.{5} at {4, date, HH:mm:ss MM/dd/yyyy} with resulting trigger instruction code: {9}
org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin org.quartz.plugin.jobInitializer.fileName =quartz_jobs.xmlorg.quartz.plugin.jobInitializer.overWriteExistingJobs = false org.quartz.plugin.jobInitializer.failOnFileNotFound = true
org.quartz.plugin.shutdownhook.class = org.quartz.plugins.management.ShutdownHookPlugin org.quartz.plugin.shutdownhook.cleanShutdown = true
系统会根据配置文件找到quartz_jobs.xml
配置之后,发现总是报错:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.scheduling.quartz.SchedulerFactoryBean#0' defined in ServletContext resource [/WEB-INF/spring/applicationContext-others.xml]: Invocation of init method failed; nested exception is org.quartz.SchedulerConfigException: Failure occured during job recovery. [See nested exception: org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: Table 'lbassnew.qrtz_locks' doesn't exist [See nested exception: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Table 'lbassnew.qrtz_locks' doesn't exist]]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1420)
浏览了一翻配置文件,发现项目原先已经有相关的quartz配置代码,于是将自己配置的SchedulerFactoryBean去掉,直接将配置的调度器放入已有的SchedulerFactoryBean中,启动,无错。
其次,在配置调度时间的时候,如果配置的启动时间为:0 50-55 16 * * ?那么,即时配置的 <property name="concurrent" value="true"/> ,启动之后也需要等待到配置的时间才会启动任务。特此记录。