關於Quartz的基本知識,這裏就再也不多說,能夠參考Quartz的example。spring
這裏主要要說的是,我的在Quartz和Spring集成的過程當中,遇到的問題和我的理解。sql
首先來講說我的的理解:數據庫
一、Quartz的運行原理apache
Quartz的重要組成部分就是,線程池和Trigger。而這些資源是被一個叫StandScheduler的類管理起來的。post
因此,每個Quartz程序咋啓動的時候,都須要建立一個Scheduler對象,由它來管理Quartz的資源。它啓動的時候,會首先啓動Quartz的調度線程,而後初始化線程池中的線程。url
每當一個trigger生效的時候,會從線程池中取出一個線程,調用對應job的execute方法,開始執行。線程
2.Quartz的job如何取消postgresql
首先你的job要繼承自interruptablejob,但job的interrupt方法被調用時,你本身能夠設一個標誌代表已經被cancel了,在execute方法不斷的檢測這個標誌,發現cacel,則中斷當前的job。對象
3.Quartz如何嵌入到Spring中繼承
首先要明白,Quartz如何啓動Spring。且看下面的pring的配置:
<bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="configLocation" value="/WEB-INF/classes/quartz.properties" />
<property name="dataSource" ref="dataSource" />
<property name="overwriteExistingJobs" value="true" />
<property name="autoStartup" value="false" />
</bean>
這個bean在Spring啓動的時候就會建立一個SchedulerFactoryBean實例,它會根據你的配置的屬性,建立一個schedule實例。
quartz的基本配置,報名線程池的設置,最大的鏈接數等
<property name="configLocation" value="/WEB-INF/classes/quartz.properties" />
須要用到jdbc store來持久化存儲,後面會詳細解釋
<property name="dataSource" ref="dataSource" />
須要overwrite已經存在的job,若是須要動態的修改已經存在的job,就須要設置爲true,不然會以數據庫中已經存在的爲準
<property name="overwriteExistingJobs" value="true" />
是否自動啓動,這個比較好理解
<property name="autoStartup" value="true" />
4.如何配置Quartz的jdbc 持久化。
Quartz自己就提供了兩種作法來作jdbc的持久化。一個是在Quartz.properties大家配置,具體能夠參考它的example。
另外一個就是本身在Spring中配置SchedulerFactoryBean的datasource屬性,你須要在Spring中建立一個datasource的bean。
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" >
<property name="driverClassName"><value>org.postgresql.Driver</value></property>
<property name="url"><value>jdbc:postgresql://127.0.0.1:3306/dms</value></property>
<property name="username"><value>username</value></property>
<property name="password"><value>password</value></property>
</bean>
我在使用中,第一種方式,一直沒有成功,沒法鏈接上數據庫,檢查了各類緣由,仍是沒有發現root cause。
但第二張方式,沒有任何問題。