SpringBoot2.3整合Quartz实现简单定时任务

1. 概述

Quartz是一个完全由Java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单而强大的机制。更多介绍,请参阅Quartz官网

1.1. 核心概念

Job
表示任务,是一个接口,只有一个方法

void execute(JobExecutionContext context);

开发一个新任务时,只需要实现该接口就能运行任务
JobDetail
任务描述,在每次执行实例时都重新创建一个job实例,不直接接受一个job实例,而是通过接受一个job实现类
Trigger
触发器,主要有SimpleTrigger和CronTrigger两个子类,当仅触发一次或者以固定时间间隔周期执行时,使用SimpleTrigger。CronTrigger通过cron表达式,定义出各种复杂时间规则的调度方案
Scheduler
调度器,代表Quartz的一个独立运行容器,Trigger和JobDetail需要注册到Scheduler中。

2. 核心依赖

新建一个springboot项目,引入核心依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

3. 编写任务实现

cron表达式实现

public class CronJob extends QuartzJobBean {
    
    

    private static final Logger logger = LoggerFactory.getLogger(CronJob.class);

    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
    
    
        logger.info("执行当前任务开始,时间为:{}", LocalDateTime.now());
    }
}

时间间隔实现

public class SimpleJob extends QuartzJobBean {
    
    

    private static final Logger logger = LoggerFactory.getLogger(SimpleJob.class);

    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
    
    
        logger.info("start job...当前时间为:{}", LocalDateTime.now());
        try {
    
    
            Thread.sleep(3000);
            logger.info(context.getScheduler().getSchedulerInstanceId());
            logger.info("task name is {}", context.getJobDetail().getKey().getName());
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
        logger.info("end job...当前时间为:{}", LocalDateTime.now());
    }
}

4. 配置类

将任务实现类注册到schedule中

@Configuration
public class ScheduleConfig {
    
    

    @Bean
    public JobDetail simpleJobDetail() {
    
    
        return JobBuilder.newJob(SimpleJob.class).withIdentity("simpleJobDetail").storeDurably().build();
    }

    @Bean
    public Trigger simpleTrigger() {
    
    
        SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(20).repeatForever();
        return TriggerBuilder.newTrigger()
                .forJob(simpleJobDetail())
                .withIdentity("simpleTrigger")
                .withSchedule(scheduleBuilder)
                .build();
    }

    @Bean
    public JobDetail cronJobDetail() {
    
    
        return JobBuilder.newJob(CronJob.class).withIdentity("cronJobDetail").storeDurably().build();
    }

    @Bean
    public Trigger cronTrigger() {
    
    
        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/30 * * * * ?");
        return TriggerBuilder.newTrigger()
                .forJob(cronJobDetail())
                .withIdentity("cronTrigger")
                .withSchedule(scheduleBuilder)
                .build();
    }
}

5. 验证

启动项目,验证结果

2021-11-01 17:54:44.485  INFO 21104 --- [eduler_Worker-3] com.xlhj.boot.job.SimpleJob              : start job...当前时间为:2021-11-01T17:54:44.485
2021-11-01 17:54:47.489  INFO 21104 --- [eduler_Worker-3] com.xlhj.boot.job.SimpleJob              : NON_CLUSTERED
2021-11-01 17:54:47.490  INFO 21104 --- [eduler_Worker-3] com.xlhj.boot.job.SimpleJob              : task name is simpleJobDetail
2021-11-01 17:54:47.490  INFO 21104 --- [eduler_Worker-3] com.xlhj.boot.job.SimpleJob              : end job...当前时间为:2021-11-01T17:54:47.490
2021-11-01 17:55:00.016  INFO 21104 --- [eduler_Worker-4] com.xlhj.boot.job.CronJob                : 执行当前任务开始,时间为:2021-11-01T17:55:00.016

猜你喜欢

转载自blog.csdn.net/liu320yj/article/details/121084256