Spring整合Quartz(七)下

简介: Spring整合Quartz(七)下

三. Spring 创建任务Bean 实现整合 Quartz 框架

Spring 可以通过两种方式,来创建 任务Bean


  1. 继承 QuartzJobBean 类,用JobDetailFactoryBean 进行生成


  1. 创建普通java 对象和任务方法,用 MethodInvokingJobDetailFactoryBean 进行生成


下面,分别对这两种方式进行演示。


三.一 继承 QuartzJobBean 类

三.一.一 创建任务

/**
 * 
 * @author 两个蝴蝶飞
 * 
 * 通过继承 QuartzJobBean 来创建作业任务Bean 
 *
 */
public class MyJob3 extends QuartzJobBean{
  @Override
  protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
  //要做的事,是打印当前的时间 
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //格式化时间
        String dateString=sdf.format(new Date());
        System.out.println("QuartzJobBean 备份数据库的时间是:"+dateString);  
        //可以通过 context 对象来获取一些重要信息 
  }
}


其实 QuartzJobBean 内部 自己实现了 Job 接口, 然后 通过重写 executeInternal()方法来代替以前的 execute()方法。

image.png


三.一.二 编写配置文件 spring-quartz3.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.MyJob3"></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="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
      <property name="triggers">
      <list>
        <ref bean="trigger1"/>
      </list>
      </property>
    </bean>


与 二.四.一 部分的配置文件内容一样。


三.一.三 测试类进行测试查看

编写 JobTest3 测试类

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_quartz3.xml")
public class JobTest3 {
  @Test
  public void test3(){
  System.out.println("继承QuartzJobBean 是否运行任务呢?"); 
  try {
    Thread.sleep(10000);
  } catch (InterruptedException e) {
    // TODO 自动生成的 catch 块
    e.printStackTrace();
  }
  }
}


运行,控制台打印输出:

image.png


三.二 普通Java 对象和任务方法

三.二.一 创建任务

/**
 * 
 * @author 两个蝴蝶飞
 * 普通的Java 类,普通的方法
 */
public class MyJob4 {
  public void myExecute(){
  //要做的事,是打印当前的时间 
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //格式化时间
        String dateString=sdf.format(new Date());
        System.out.println("MethodInvoking 备份数据库的时间是:"+dateString); 
        //如果要传递数据的话,需要自己在生成jobDetail时进行配置
  }
}


三.二.二 配置文件 spring-quartz4.xml

用 MethodInvokingJobDetailFactoryBean 来创建相应的JobDetail.


用 targetObject 和 targetMethod 属性来指定 哪一个类的哪一个方法。

<!-- 定义 JobDetail, 所用的bean 为 MethodInvokingJobDetailFactoryBean -->
    <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
      <!-- 任务名 -->
      <property name="name" value="job1"></property>  
      <!-- 组名 -->
      <property name="group" value="group1"></property>
      <!--是否同步-->
      <property name="concurrent" value="true"></property>
      <!-- 哪一个任务 -->
      <property name="targetObject">
      <bean class="com.yjl.job.MyJob4"></bean>
      </property>
      <!-- 哪一个方法 -->
      <property name="targetMethod" value="myExecute"></property>
    </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>


三.二.三 测试文件测试

编写 JobTest4.java 测试类

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_quartz4.xml")
public class JobTest4 { 
  @Test
  public void test4(){
  System.out.println("自定义类和方法是否运行任务呢?");  
  try {
    Thread.sleep(10000);
  } catch (InterruptedException e) {
    // TODO 自动生成的 catch 块
    e.printStackTrace();
  }
  }
}

image.png


注意,此时是先输出语句,再运行6次。


这就是 Spring 整合 Quartz框架的几种方式,老蝴蝶强烈建议使用第3种,继承 QuartzJobBean的方式。

相关文章
|
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