Quartz与Spring集成

关于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。

但第二张方式,没有任何问题。