SpringBoot常用定时器库整合(Java Timer、线程池、Quartz、Task)

简介

定时器可用于做数据统计、年度报表、定时刷新token等。

本章主要描述以下常用定时器库的用法:

1.Java Timer

2.Java 线程池

3.Quartz

4.Spring Task

Java Timer定时器用法

在java中自带了TimerTask抽象类用于定时器,用法如下:

Timer timer = new Timer();
// 两秒执行一次
timer.schedule(new TimerTask() {
    @Override
    public void run() {
        System.out.println("定时器执行...");
    }
}, 0, 2000L);

Java 线程池定时器用法

ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(10);
// 第一个参数放Runnable/Callable 线程实现,第二个参数0秒后执行,第三个参数每隔2秒执行一次
threadPool.scheduleAtFixedRate(() -> {
	System.out.println("定时器执行...");
}, 0, 2L, TimeUnit.SECONDS);

SpringBoot 整合Quartz

使用java原生的定时器不够灵活,Quartz可实现复杂的业务还支持cron表达式,整合如下:

pom.xml导入依赖

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-quartzartifactId>
dependency>

Quartz配置类主要包含以下三个步骤:

  1. 编写任务实现类
  2. 定义工作明细
  3. 绑定任务触发器

代码如下:

import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.QuartzJobBean;

@Configuration
@Slf4j
public class QuartzConfig {

    // 任务实现类
    public class Task1 extends QuartzJobBean {
        @Override
        protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
            log.info("quartz 任务执行...");
        }
    }

    // 任务明细
    @Bean
    public JobDetail jobDetail(){
        return JobBuilder.newJob(Task1.class).storeDurably().build();
    }

    // 绑定任务触发器
    @Bean
    public Trigger printJobTrigger(@Autowired JobDetail jobDetail){
        // cron表达式为每5秒执行一次
        return TriggerBuilder.newTrigger().forJob(jobDetail)
                .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")).build();
    }
}

打印如下:

2022-09-04 22:37:17.095  INFO 30308 --- [           main] com.terry.App                            : Started App in 1.734 seconds (JVM running for 2.959)
2022-09-04 22:37:20.014  INFO 30308 --- [eduler_Worker-1] com.terry.QuartzConfig                   : quartz 任务执行...
2022-09-04 22:37:25.015  INFO 30308 --- [eduler_Worker-2] com.terry.QuartzConfig                   : quartz 任务执行...
2022-09-04 22:37:30.006  INFO 30308 --- [eduler_Worker-3] com.terry.QuartzConfig                   : quartz 任务执行...
2022-09-04 22:37:35.008  INFO 30308 --- [eduler_Worker-4] com.terry.QuartzConfig                   : quartz 任务执行...

Spring Task

开启定时器

@SpringBootApplication
@EnableScheduling
public class App {

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

定时器类设置 cron表达式

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class TaskBean {

    @Scheduled(cron = "0/1 * * * * ?")
    public void print(){
        log.info("spring task 执行中...");
    }
}

运行如下:

2022-09-04 22:45:05.655  INFO 13676 --- [           main] com.terry.App                            : Started App in 1.743 seconds (JVM running for 3.108)
2022-09-04 22:45:06.012  INFO 13676 --- [   scheduling-1] com.terry.TaskBean                       : spring task 执行中...
2022-09-04 22:45:07.003  INFO 13676 --- [   scheduling-1] com.terry.TaskBean                       : spring task 执行中...

你可能感兴趣的:(SpringBoot,java,spring,boot,spring)