Quartz简介
1.Quartz,是一个完全由java编写的开源作业调度框架。它包含了调度器监听、作业和触发器监听,而我们在项目中最常用到的就是它可以作为一个定时器,可以随时配置监听、触发任务进行作业。
2.在Spring的框架里,Quartz已经被很好地集成,我们只需要在xml文件里面配一下定时时间就可以自动执行任务了。
3.本博客主要介绍的是一个quartz项目的完整的搭建、配置以及成功运行的过程,里面包含了多个定时器的配置以及多个数据库的配置方法,非常适合新手去接触和掌握quartz的使用而且还附有完整的quartz定时器项目实例下载,项目下载地址:QuartzTask定时器项目实例
项目实例详解
1.首先我们看一下整个项目的结构,最基本的spring架构:
2.接下来我们将逐个步骤去搭建、配置以及运行这个项目,每个步骤在项目里面我都配有详细的说明,
(1)首先,我们看一下web.xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 加载spring配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext*.xml</param-value>
</context-param>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:log4j.properties</param-value>
</context-param>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
(2)其次,我们看一下加载的spring配置文件applicationContext.xml配置:
<!-- 加载配置属性文件,数据库文件 -->
<context:property-placeholder ignore-unresolvable="true" location="classpath:/jdbc.properties" />
<!-- 使用Annotation自动注册Bean -->
<context:component-scan base-package="com.hqc"><!-- base-package 如果多个,用“,”分隔 -->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 数据源可自行配置添加多个,这里只演示postgresql和mysql数据源示例,需要哪些可自行添加测试,都是经过实践成功的-->
<!-- Postgresql数据库连接配置 -->
<bean id="postgresqlDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="org.postgresql.Driver"></property>
<property name="url" value="jdbc:postgresql://localhost:2345/jftest"></property>
<property name="username" value="postgres"></property>
<property name="password" value="1234"></property>
<property name="initialSize" value="20"></property>
<property name="maxActive" value="20"></property>
<property name="defaultAutoCommit" value="true"></property>
</bean>
<!-- Mysql数据库连接配置-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 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}" />
</bean>
<!-- oracle数据库连接配置, 使用 BoneCP数据库连接池
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" 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="initialSize" value="${jdbc.pool.init}" />
<property name="minIdle" value="${jdbc.pool.minIdle}" />
<property name="maxActive" value="${jdbc.pool.maxActive}" />
<property name="maxWait" value="60000" />
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<property name="minEvictableIdleTimeMillis" value="300000" />
<property name="validationQuery" value="${jdbc.testSql}" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<property name="filters" value="stat" />
</bean>-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
<!-- Greenplum数据库连接配置
<bean id="postgresqlDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.pivotal.jdbc.GreenplumDriver"></property>
<property name="url" value="jdbc:pivotal:greenplum://localhost:2345;DatabaseName=jftest"></property>
<property name="username" value="greenplum"></property>
<property name="password" value="1234"></property>
<property name="initialSize" value="20"></property>
<property name="maxActive" value="20"></property>
<property name="defaultAutoCommit" value="true"></property>
</bean>-->
<!-- 定时器1 -->
<bean id="taskTrigger1" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail">
<bean
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<bean class="com.hqc.service.DataStaticService"></bean><!--目标类-->
</property>
<property name="targetMethod" value="testMethod1" /><!--目标方法-->
<property name="concurrent" value="false" />
</bean>
</property>
<property name="cronExpression">
<!-- 秒、分、时、日期、月份、星期、年 -->
<!-- 具体的更多的写法可以参照:https://blog.csdn.net/alan_liuyue/article/details/80222565 -->
<value>0/5 * * * * ? </value> <!-- 每五秒执行一次 -->
</property>
</bean>
<!-- 定时器2-->
<bean id="taskTrigger2" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail">
<bean class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<bean class="com.hqc.service.DataStaticService"></bean>
</property>
<property name="targetMethod" value="testMethod2" />
<property name="concurrent" value="false" />
</bean>
</property>
<property name="cronExpression">
<value>0 0 0/1 * * ?</value> <!-- 每一小时执行一次 -->
</property>
</bean>
<!-- 总调度用于启动Spring定时器,可以启动多个,需要启动哪一个就去掉注释即可-->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="taskTrigger1" /> <!--调度第一个定时任务 -->
<ref bean="taskTrigger2" /> <!--调度第二个定时任务 -->
</list>
</property>
</bean>
(3)然后,就是数据库的配置文件jdbc.properties,这个文件可以将所有的数据库连接属性都写在里面,当然你也可以直接在applicationContext.xml里面直接配置数据库信息,一个项目可以配置多个数据源,相信大家都是没问题的:
##oracle数据库配置
#jdbc.type=oracle
#jdbc.driver=oracle.jdbc.driver.OracleDriver
#jdbc.url=jdbc:oracle:thin:@localhost:1521:testora
#jdbc.username=test
#jdbc.password=test
##pool settings
#jdbc.pool.init=10
#jdbc.pool.minIdle=30
#jdbc.pool.maxActive=50
##jdbc.testSql=SELECT 'x'
#jdbc.testSql=SELECT 'x' FROM DUAL
#mysql数据库配置
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/jftest?useSSL=false&useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=1234
(4)接下来我们再讲一下项目里面的各个文件的作用,这里直接用一张图给大家进行展示说明:
(5)我们看一下在配置文件里quartz指定的定时执行的方法:
/**
*
* @author hqc
* @version 2018年05月20日
*
*/
public class DataStaticService {
protected static Logger logger = Logger.getLogger(DataStaticService.class);
@Autowired
DataPostgresqlDao dataPostgresqlDao;
@Autowired
DataOracleDao dataOracleDao;
/**
* 测试定时方法1
*/
public void testMethod1(){
Calendar c = Calendar.getInstance();
String today = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(c.getTime());
System.out.println("定时任务程序运行时间:"+today);
System.out.println("定时查询oracle库t_user表的数据数量:"+dataOracleDao.queryTest().size());
}
/**
* 测试定时方法2
*/
public void testMethod2(){
Calendar c = Calendar.getInstance();
String today = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(c.getTime());
//昨天的当前时间
// c.add(Calendar.DATE, -1);
// String yesterday = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(c.getTime());
System.out.println("定时任务程序运行时间:"+today);
System.out.println("定时查询postgresql库t_user表的数据数量:"+dataPostgresqlDao.queryTest().size());
}
}
(6)最后,我们看一下定时任务执行的效果,这里我设置的是每5秒执行一次:
总结
1.好了,以上就是spring框架使用Quartz执行定时任务完整实例详解,很适合新手去熟悉和掌握quartz;
2.实践是认识真理性的唯一标准,通过这一个简单的项目实践,有兴趣的小伙伴们能继续去深入研究,从而形成一套适合自己的定时器项目,在项目中运用的时候就会事半功倍;