当前位置: > > > SpringBoot - 定时任务的实现教程2(通过集成Quartz来实现)

SpringBoot - 定时任务的实现教程2(通过集成Quartz来实现)

二、集成 Quartz 来实现定时任务

1,Quartz 介绍

  • Quartz 是一个功能丰富的开源作业调度库,它由 Java 写成,可以集成在任何 Java 应用程序中,包括 Java SEJava EE 等。
  • 使用 Quartz 可以创建简单或者复杂的执行计划,它支持数据库、集群、插件以及邮件,并且支持 cron 表达式,具有极高的灵活性。
  • Spring Boot 中集成 Quartz Spring 中集成 Quartz 比较类似,主要提供三个 BeanJobDetailTrigger 以及 SchedulerFactory

2,添加依赖

首先编辑项目的 pom.xml 文件,添加 Quartz 依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

3,创建 Job

(1)接着我们使用不同的方式创建两个 JobJob 可以是一个普通的 JavaBean。如果是普通的 JavaBean,那么可以先添加 @Component 注解将之注册到 Spring 容器中。
@Component
public class MyFirstJob {
    public void sayHello() {
        System.out.println("MyFirstJob:sayHello:"+new Date());
    }
}

(2)Job 也可以继承抽象类 QuartzJobBean。若继承自 QuartzJobBean,则要实现该类中的 executeInternal 方法,该方法在任务被调用时使用。
public class MySecondJob extends QuartzJobBean {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    @Override
    protected void executeInternal(JobExecutionContext context){
        System.out.println("hello:"+name+":"+new Date());
    }
}

4,提供 Quartz 相关配置 Bean

接下来创建 QuartzConfig JobDetail Trigger 进行配置,并创建 SchedulerFactory
(1)JobDetail 的配置有两种方式:
  • 第一种方式通过 MethodInvokingJobDetailFactoryBean 类配置 JobDetail,只需要指定 Job 的实例名和要调用的方法即可,注册这用方式无法在创建 JobDetail 时传递参数。
  • 第二种方式通过 JobDetailFactoryBean 来实现,这种方式只需要指定 JobClass 即可,然后可以通过 JobDataMap 传递参数到 Job 中,Job 中只需要提供属性名,并且提供一个相应的 set 方法即可接收到参数。
(2)Trigger 有多种不同的实现,这里展示两种常用的 TriggerSimpleTrigger CronTrigger
  • SimpleTrigger 使用 SimpleTriggerFactoryBean 进行创建。在 SimpleTriggerFactoryBean 对象中,首先设置 JobDetail,接着配置任务循环次数、任务启动延迟时间、任务的时间间隔。
  • CronTrigger 使用 CronTriggerFactoryBean 进行创建。在 SimpleTriggerFactoryBean 对象中,则主要配置 JobDetail Cron 表达式。
@Configuration
public class QuartzConfig {
    /********** 配置两个 JobDetail **********/
    // 通过 MethodInvokingJobDetailFactoryBean 类配置 JobDetail
    @Bean
    MethodInvokingJobDetailFactoryBean jobDetail1() {
        MethodInvokingJobDetailFactoryBean bean =
                new MethodInvokingJobDetailFactoryBean();
        bean.setTargetBeanName("myFirstJob");
        bean.setTargetMethod("sayHello");
        return bean;
    }

    // 通过 JobDetailFactoryBean 来实现 JobDetail
    @Bean
    JobDetailFactoryBean jobDetail2() {
        JobDetailFactoryBean bean = new JobDetailFactoryBean();
        bean.setJobClass(MySecondJob.class);
        JobDataMap jobDataMap = new JobDataMap();
        jobDataMap.put("name","sang");
        bean.setJobDataMap(jobDataMap);
        bean.setDurability(true);
        return bean;
    }

    /********** 创建两个 Trigger **********/
    // 创建一个 SimpleTrigger
    @Bean
    SimpleTriggerFactoryBean simpleTrigger() {
        SimpleTriggerFactoryBean bean = new SimpleTriggerFactoryBean();
        bean.setJobDetail(jobDetail1().getObject()); // 设置 jobDetail
        bean.setRepeatCount(3); // 任务循环次数为3(总共会执行4次)
        bean.setStartDelay(2000); // 任务启动延迟2秒执行
        bean.setRepeatInterval(2000);  // 任务的时间间隔为2秒
        return bean;
    }

    // 创建一个 CronTrigger
    @Bean
    CronTriggerFactoryBean cronTrigger() {
        CronTriggerFactoryBean bean = new CronTriggerFactoryBean();
        bean.setJobDetail(jobDetail2().getObject()); // 设置 jobDetail
        bean.setCronExpression("* * * * * ?"); // 设置 Cron 表达式
        return bean;
    }

    /********** 创建 SchedulerFactory **********/
    @Bean
    SchedulerFactoryBean schedulerFactory() {
        // 通过 SchedulerFactoryBean 创建 SchedulerFactor
        SchedulerFactoryBean bean = new SchedulerFactoryBean();
        // 配置两个 Trigger
        SimpleTrigger simpleTrigger = simpleTrigger().getObject();
        CronTrigger cronTrigger = cronTrigger().getObject();
        bean.setTriggers(simpleTrigger,cronTrigger);
        return bean;
    }
}

5,运行测试

    启动项目,控制台输出如下,可以看到 MyFirstJob 在重复 3 次之后便不再执行(一共执行 4 次),而 MySecondJob 则每秒执行 1 次,一直执行下去。
评论0