一、Quartz的介绍

      Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,是完全由java开发的一个开源的任务日程管理系统,“任务调度管理器”就是一个在预先确定(被纳入日程)的时间到达时,负责执行(或者通知)其他软件组件的系统。Quartz用一个小Java库发布文件(.jar文件),这个库文件包含了所有Quartz核心功能。这些功能的主要接口(API)是Scheduler接口。它提供了简单的操作,例如:将任务纳入日程或者从日程中取消,开始/停止/暂停日程进度。

二、Quartz与Spring的整合

1、通过基于xml配置文件的方式整合Quartz

       (1)首先来让我们看一下scheduler、trigger、jobDetail、job和cron的关系图,可以看到每个JobDetail中包含一个Job,每个Trigger包含一个JobDetail以及cron表达式 (即触发的时机),一个Scheduler可以包含多个Trigger。如下图所示:

      

     (2)添加jar包依赖

<!-- quartz任务调度 -->
<dependency>
     <groupId>org.quartz-scheduler</groupId>
     <artifactId>quartz</artifactId>
     <version>2.3.1</version>
</dependency>

<dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-tx</artifactId>
     <version>5.1.5.RELEASE</version>
</dependency>

<dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-context-support</artifactId>
     <version>5.1.5.RELEASE</version>
</dependency>

    (3)创建一个普通的java类,即Job类 或者叫 任务类,需要注意的是:任务方法不能有参数传入且任务方法的返回值最好设置为void (方法的返回值不设置为void也是可以运行的,这里只是建议返回值为void)

package com.quartz.job;

import java.text.SimpleDateFormat;
import java.util.Date;

public class MyJob {

    /**
     * @Date 15:27 2019/7/10
     * @Name execute
     * @Param []
     * @return void
     **/
    public void execute(){
        System.out.println("Hello MyJob  "+  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ").format(new Date()));
    }
    
}

(4)配置application-quartz.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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.2.xsd">

        <!-- 使用quartz四步走!
            1.配置任务bean
            2.配置job任务
            3.配置JobDetail触发器
            4.配置调度器
        -->

      <!-- 1.配置任务bean -->
      <bean id="myJob" class="com.quartz.job.MyJob"/>

      <!-- 2.配置job任务 -->
      <bean id="springQuartzJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
          <property name="targetObject" ref="myJob">
          <property name="targetMethod" value="execute">    <!-- value的值必须与我们定义的MyJob类的方法名一致 -->
      </bean>

      <!-- 3.配置Trigger触发器 -->
      <bean id="trigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
           <property name="jobDetail" ref="springQuartzJobDetail"/>
           <property name="cronExpression" value="0/5 * * * * ?"/>   <!-- cron表达式,指定任务的触发时机,即每过5秒执行一次 -->
      </bean>

      <!-- 4.配置Scheduler调度器 -->
      <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
           <property name="triggers">
                <list>
                    <ref bean="trigger"/>
                </list>
           </property>
      </bean>

</beans>

  (5)开始测试执行,执行代码如下:

package com.quartz.job;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ExecuteJob {

    public static void main(String[] args) {

        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("application-quartz.xml");
    }

}

  (6)执行结果如下所示:

Hello MyJob  2019-07-11 23:34:40 
Hello MyJob  2019-07-11 23:34:45 
Hello MyJob  2019-07-11 23:34:50 
Hello MyJob  2019-07-11 23:34:55 
Hello MyJob  2019-07-11 23:35:00 

2、通过基于注解的方式整合Quartz

  (1)添加jar包依赖,与 基于xml配置文件的方式整合Quartz所依赖的jar包是一样的
  (2)创建一个普通的java类,即Job类 或者叫 任务类,需要注意的是:任务方法不能有参数传入且任务方法的返回值最好设置为void (方法的返回值不设置为void也是可以运行的,这里只是建议返回值为void),在Job类上添加注解@EnableScheduling 和 @Component,在要执行任务的方法上添加@Scheduled(cron = "0/5 * * * * ?")

package com.quartz.job;

import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;

@Component
@EnableScheduling   //通过@EnableScheduling注解开启对@Scheduled计划任务的支持
public class MyJob {

    @Scheduled(cron="0/5 * * * * ?")
    public void execute(){
        System.out.println("Hello MyJob  "+  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ").format(new Date()));
    }

}

关于@Scheduled还有如下其他三种定时器机制注解:

1、@Scheduled(fixedDelay = 10000) 
  fixedDelay 的执行规则是上一个任务结束后到下个任务开始的间隔时间为设定时间,单位是毫秒(例:@Scheduled(fixedDelay = 10000) 代表间隔10秒执行一次)

2、@Scheduled(fixedRate= 10000) 
  fixedRate表示上个任务开始到下个任务开始之间的间隔时间,单位也是毫秒。

3、@Scheduled(initialDelay= 10000) 
  这个代表第一次调用任务方法前延迟一段时间后执行,单位也是毫秒

  (3)配置application-quartz.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">

      <context:component-scan base-package="com.quartz.job"/>

</beans>

 (4)开始测试执行,执行代码与 基于xml配置文件的方式整合Quartz所执行的测试代码是一样的,执行结果如下所示:

Hello MyJob  2019-07-11 23:58:55 
Hello MyJob  2019-07-11 23:59:00 
Hello MyJob  2019-07-11 23:59:05 
Hello MyJob  2019-07-11 23:59:10 
Hello MyJob  2019-07-11 23:59:15

三、Quartz与SpringBoot的整合

(1)添加jar包依赖

<dependency>
     <groupId>org.quartz-scheduler</groupId>
     <artifactId>quartz</artifactId>
     <version>2.3.1</version>
</dependency>

(2)在Service服务中编写任务方法,需要注意的是:任务方法不能有参数传入且任务方法的返回值最好设置为void (方法的返回值不设置为void也是可以运行的,这里只是建议返回值为void)

package com.quartz.service;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.util.Date;

@Service
public class JobService {

    @Scheduled(cron = "0/5 * * * * ?")
    public void execute(){
        System.out.println("Hello JobService  "+  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ").format(new Date()));
    }

}

(3)在SpringBoot的入口启动类上添加注解@EnableScheduling

package com.quartz;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@EnableScheduling
@SpringBootApplication
public class SpringBootQuartzApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootQuartzApplication.class, args);
    }

}

(4)开始测试执行,执行结果如下所示:

Hello JobService  2019-07-12 11:21:20 
Hello JobService  2019-07-12 11:21:25 
Hello JobService  2019-07-12 11:21:30 
Hello JobService  2019-07-12 11:21:35 
Hello JobService  2019-07-12 11:21:40

Cron表达式的介绍与使用

                         

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐