在这边记录一下关于使用quartz框架的一些问题和解决方案,其中关于quartz的一些基本使用方式和基本配置都不会提到,网上有关资料特别多。
首先使用quartz有如下几种方式:
1.使用内存机制,采用默认的配置文件,直接在代码当中配置定时任务的执行类以及对应的执行时间。
2.使用数据库,需要新建配置文件quartz.properties配置数据库连接,同时其余如上。
3.结合spring,在xml文件中配置SchedulerFactoryBean,CronTriggerFactoryBean,MethodInvokingJobDetailFactoryBean,外加一个任务执行类的容器,合计4个Bean,就能够完成一个定时任务的配置,无需任何代码片段,除过执行类。
4.结合spring,但是任务内容和执行时间都由用户动态制定,此时在配置文件中配置一个SchedulerFactoryBean即可,然后在动态获取这个容器,往其中按照方式1的方法添加内容。
其实往大的方向说,quartz有两种模式:集群和非集群。只不过集群模式必须使用数据库,同时需要在配置文件中的org.quartz.jobStore.isClustered = true,这样即可。
我参与的项目重点使用了3和4,3主要完成一些比较常规的定时任务,比如定时更新数据库类似的任务。而4就是完成用户自己的需求。
现在开始讲解整个过程:
1.基本配置
首先看一下applicationContext-quartz.xml
<!-- schedulerBean -->
<bean id="chedulerFactoryBean"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!-- 指定quartz配置文件 -->
<property name="configLocation" value="classpath:quartz.properties" />
<!--必QuartzScheduler 延时启动,应用启动完后 QuartzScheduler 再启动,单位秒 -->
<property name="startupDelay" value="3" />
<!-- 设置自动启动 -->
<property name="autoStartup" value="true" />
<property name="applicationContextSchedulerContextKey" value="applicationContextKey" />
<property name="schedulerName" value="DefaultQuartzScheduler" />
<property name="dataSource" ref="dataSource"/>
</bean>
其中的参数都比较简单,就是关于dataSource的话,使用的是spring的配置,而不是在配置文件quartz.properties的配置,所以配置文件中就不需要配置了。下面是dataSource的配置:
<!-- 数据源配置, 使用Tomcat JDBC连接池 -->
<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="maxActive" value="${jdbc.pool.maxActive}" />
<property name="maxIdle" value="${jdbc.pool.maxIdle}" />
<property name="minIdle" value="0" />
<property