二. 将 Quartz 框架整合到 Spring 项目里面
二.一 在 pom.xml 中添加 关于 quartz的依赖
<!-- quartz的 jar包 --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz-jobs</artifactId> <version>2.3.2</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> </dependency>
二.二 编写作业任务 MyJob.java
MyJob.java
package com.yjl.job; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; /** * * @author 两个蝴蝶飞 * *Quartz框架方式 创建任务 */ public class MyJob implements Job{ @Override public void execute(JobExecutionContext context) throws JobExecutionException { //要做的事,是打印当前的时间 SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //格式化时间 String dateString=sdf.format(new Date()); System.out.println("普通Job 备份数据库的时间是:"+dateString); } }
二.三 简单触发器 SimpleTrigger 触发
二.三. 一 在resource 目录下 创建 quartz 的配置文件 spring-quartz2.xml
(用的是2,而不是1, 是因为老蝴蝶测试时先测试的Cron表达式,后面才添加的简单触发器形式。)
spring-quartz2.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd "> <!-- 定义 JobDetail, 所用的bean 为 JobDetailFactoryBean --> <bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <!-- 任务名 --> <property name="name" value="job1"></property> <!-- 组名 --> <property name="group" value="group1"></property> <!-- 关联任务 --> <property name="jobClass" value="com.yjl.job.MyJob"></property> <!-- 必须是true, 如果是false的话,当这个jobDetail没有被Trigger关联时,会删除 --> <property name="durability" value="true"></property> <!-- 还有一个重要的 applicationContextJobDataKey 属性,这一章节先不讲解--> </bean> <!-- 配置一个简单的触发器 --> <bean id="trigger1" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"> <!-- 触发器名称 --> <property name="name" value="name1"></property> <!-- 组名称 --> <property name="group" value="group1"></property> <!-- 开启的延迟时间,如果为0 就是 startNow() --> <property name="startDelay" value="0"></property> <!-- 运行次数 --> <property name="repeatCount" value="3"></property> <!-- 运行间隔,毫秒为单位 --> <property name="repeatInterval" value="3000"></property> <!-- 关联哪一个 任务, 直接放置到触发器里面 --> <property name="jobDetail" ref="jobDetail"></property> </bean> <!-- 配置 scheduler 调度器 --> <bean id="scheduler1" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <!-- 是集合,可以配置多个 触发器。 触发器里面为jobDetail,在Scheduler里面就不配置了--> <ref bean="trigger1"/> </list> </property> </bean> </beans>
二.三.二 把 quartz配置文件放置到 springmvc.xml 中引用
在springmvc.xml 中,引入 spring-quartz2.xml 文件
<!-- bean组件扫描 --> <context:component-scan base-package="com.yjl.action.quartz" /> <!-- 引入包含 quartz.xml --> <import resource="classpath*:spring_quartz2.xml"/>
二.三.三 重启服务器,进行测试
当服务器一启动时,就自动执行任务。 共执行四次(刚开始一次+设置的3次, 共4次)
二.三.四 测试类进行测试查看
创建一个测试类 JobTest2 进行测试
package com.yjl.test; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) //引入配置文件 @ContextConfiguration("classpath*:spring_quartz2.xml") public class JobTest2 { @Test public void test2(){ System.out.println("SimpleTrigger 是否运行任务呢?"); //需要休眠10s后,再关闭。 不然启动测试后直接关闭,看不出效果。 try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } }
正常运行4次,与服务器启动时效果一致。
(接下来均用 测试类进行测试,不用服务器启动测试)
二.四 Cron 触发器 CronTrigger 触发
关于 cron 触发器的强大之处和简单触发器的不足,前面已经比较过了,老蝴蝶这儿就不再写了。
依赖和 作业任务 MyJob.java 均不变。
二.四.一 配置 cron 触发器的配置文件 spring-quartz.xml
<!-- 定义 JobDetail, 所用的bean 为 JobDetailFactoryBean --> <bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <!-- 任务名 --> <property name="name" value="job1"></property> <!-- 组名 --> <property name="group" value="group1"></property> <!-- 关联任务 --> <property name="jobClass" value="com.yjl.job.MyJob"></property> <!-- 必须是true, 如果是false的话,当这个jobDetail没有被Trigger关联时,会删除 --> <property name="durability" value="true"></property> <!-- 还有一个重要的 applicationContextJobDataKey 属性,这一章节先不讲解--> </bean> <!-- 定义 cron 触发器 --> <bean id="trigger1" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <!-- 配置触发器的名称 --> <property name="name" value="trigger1"></property> <!-- 配置触发器的组名 --> <property name="group" value="group1"></property> <!-- 配置关联的 JobDetail --> <property name="jobDetail" ref="jobDetail"></property> <!-- 配置 cron 表达式 ,每2秒触发一次--> <property name="cronExpression" value="0/2 * * * * ?"></property> </bean> <!-- 配置 scheduler 调度器 --> <bean id="scheduler1" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="trigger1"/> </list> </property> </bean>
二.四.二 测试类进行测试查看
创建一个测试类 JobTest 进行测试
package com.yjl.test; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) //引入配置文件 @ContextConfiguration("classpath*:spring_quartz.xml") public class JobTest { @Test public void test(){ System.out.println("CronTrigger 是否运行任务呢?"); //需要休眠10s后,再关闭。 不然启动测试后直接关闭,看不出效果。 try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } }
运行程序,控制台打印输出
cron 表达式配置成功。
上面的任务调度 MyJob, 需要实现 Job 接口, 准确地来说,还是 Quartz 框架自己创建的, 能不能让 Spring 创建呢?