Spring整合Quartz(七)中

简介: Spring整合Quartz(七)中

二. 将 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"/>


二.三.三 重启服务器,进行测试

image.png


当服务器一启动时,就自动执行任务。 共执行四次(刚开始一次+设置的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();
  }
  }
}

image.png


正常运行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();
  }
  }
}



运行程序,控制台打印输出


image.png

cron 表达式配置成功。


上面的任务调度 MyJob, 需要实现 Job 接口, 准确地来说,还是 Quartz 框架自己创建的, 能不能让 Spring 创建呢?

相关文章
|
7月前
|
Java Spring
spring集成Quartz时区问题造成任务晚执行八小时
spring集成Quartz时区问题造成任务晚执行八小时
|
10月前
|
Java 数据库连接 数据库
quartz(四)如何在job中使用spring自动注入
quartz(四)如何在job中使用spring自动注入
117 0
|
Java 调度 Maven
spring boot 2.0 quartz 轻松实现定时任务和作业调度
spring boot 2.0 quartz 轻松实现定时任务和作业调度
102 0
|
Java 调度
Springboot 使用Quartz定时器执行多个定时任务 配置篇
Springboot 使用Quartz定时器执行多个定时任务 配置篇
651 0
Springboot 使用Quartz定时器执行多个定时任务 配置篇
|
缓存 Java 调度
【Quartz】——与spring整合
【Quartz】——与spring整合
109 0
|
Oracle NoSQL Java
Springboot Quartz定时任务的动态调度使用,实战详解
Springboot Quartz定时任务的动态调度使用,实战详解
479 0
Springboot Quartz定时任务的动态调度使用,实战详解
|
Java Spring
Quartz - Quartz之Spring整合篇
Quartz - Quartz之Spring整合篇
113 0
Quartz - Quartz之Spring整合篇
|
XML Java 调度
JAVA | Spring + quartz 实现定时任务
很久不见,因为忙着泡妞,断更了一个月,实在是罪过。废话不多说,最近在工作中遇到了使用 quartz 实现定时任务的需求。写出来分享给大家,权当笔记。
JAVA | Spring + quartz 实现定时任务
|
开发框架 Java 应用服务中间件
spring整合quartz框架
在一些项目中,往往需要定时的去执行一些任务,比如商城项目,每天0点去统计前一天的销量。那么如何实现呢,总不可能我们每天0点手动的去执行统计销量的方法吧,这时就quartz就起作用了。
spring整合quartz框架
|
Java BI 调度
23、springboot集成quartz
spring支持多种定时任务的实现,今天介绍一下spring定时器和quartz定时器的使用。
184 0
23、springboot集成quartz