Spring Boot集成Quartz

SpringBoot Sep 21, 2018

前言

最近遇到一个项目需求是实现定时数据的拉取功能。什么时候进行拉取由用户在前端设置。首先想到的是Java自带的ScheduledExecutorService,研究了下发现:使用起来不是很方便,前端设置的时候会设置循环的周期和具体的时间。如果采用ScheduledExecutorService我需要进行复杂的转换才可以使用。另外就是想到了用Spring Boot自带的Schedule注解,但是最后了解后也太适合。首先Schedule注解不是动态的,需要事先配置。也有动态的使用方式,但是不太满足需求。最后决定使用Quartz来实现定时任务的需求。使用Quartz的好处:

  1. 可以动态添加,修改,删除定时任务。
  2. 用户在前端设置定时任务的时候可以直接生成cron表达式,不需要进行转换。

1 Quartz的介绍

1.1 Quartz是什么

Quartz是一个开源的作业调度库,可以被整合进任何Java应用中。

1.2 Quartz的核心组件

  1. Scheduler:核心组件用来操作调度作业
  2. Job:是一个接口,用来执行任务的业务逻辑。
  3. JobDetail:用来实例化Job
  4. Trigger:一个组件,用来决定Schedule如何执行Job
  5. JobBuilder:用来构建和定义JobDetail
  6. TriggerBuilder:用来构建和定义Trigger 这么多概念都要晕了。简单来说就是,使用Quartz来执行调度任务。我们要实现Job接口来实现我们的业务逻辑。然后通过JobDetail来实例化自定义的Job。想要获取一个JobDetail需要使用JobBuilder。同时我们需要一个Trigger来定义我们的Job如何执行。获取Trigger通过TriggerBuilder。他们之间的关系如下图:

1.3 代码示例:

        SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();

        Scheduler sched = schedFact.getScheduler();

        sched.start();

        // define the job and tie it to our HelloJob class
        JobDetail job = newJob(HelloJob.class)
                .withIdentity("myJob", "group1")
                .build();

        // Trigger the job to run now, and then every 40 seconds
        Trigger trigger = newTrigger()
                .withIdentity("myTrigger", "group1")
                .startNow()
                .withSchedule(simpleSchedule()
                        .withIntervalInSeconds(40)
                        .repeatForever())
                .build();

        // Tell quartz to schedule the job using our trigger
        sched.scheduleJob(job, trigger);

HelloJob.java

   public class HelloJob implements Job {

    public HelloJob() {
    }

    public void execute(JobExecutionContext context)
      throws JobExecutionException
    {
      System.err.println("Hello!  HelloJob is executing.");
    }
  }

下面我们来看看如何在Spring Boot中使用Quartz

2 Spring Boot集成Quartz

2.1 Maven依赖:

Spring Boot的版本要2.0以上,才能使用spring-boot-starter-quartz

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.RELEASE</version>
    </parent>
    
     <dependencies>
        <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>
     </dependencies>

2.2 使用方式

在使用上和直接使用基本相同。不同的地方在于获取Scheduler。直接使用的时候通过实例化SchedulerFactory获取Scheduler。Spring Boot通过SchedulerFactoryBean获取Scheduler。Spring Boot会自动配置一个内存存储的SchedulerFactoryBean。我们可以通过自动装填直接使用:

@Component
public class ScheduleUtils {

    @Autowired
    private  SchedulerFactoryBean schedulerFactoryBean;
}

如果想自定义Quartz可以通过,如下方法来实现:

  1. 配置属性(spring.quartz.*)
  2. 自定义SchedulerFactoryBean
  3. 自定义SchedulerFactoryBeanCustomizer

3 总结:

Quartz的使用起来还是很方便的,概念理解起来也很容易。阅读完官方文档后,我要一路小跑去完成需求了~

zzx

There is my place for writing,coding and reading