最近要用到squartz來配置定時任務調度,網上搜了許多資料,也查了許多實例代碼,大抵基本的調度代碼都以下所示:java
以下代碼轉自:http://blog.csdn.net/sambino/article/details/3934670,sambino的專欄。mysql
1. javabean類
在Test.QuartzJob中web
package Test;spring
public class QuartzJob {
public void work()
{
System.out.println("Quartz的任務調度!!!");
}
}sql
2. 設置Spring的xml
我新建了一個applicationContext_quartz.xml,內容以下:app
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">spa
<!-- 要調用的工做類 -->
<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>.net
3. 設置web.xml對Spring加載code
<!-- 加載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>xml
注意:1.導入quartz-all-1.5.2.jar 下載http://download.csdn.net/source/1026766
2.導入spring.jar(我用的是spring2.0之前的版本) 下載http://download.csdn.net/source/1041819
若是不導入的話
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.xml
org.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"/> ,啓動以後也須要等待到配置的時間纔會啓動任務。特此記錄。