简介
定时器可用于做数据统计、年度报表、定时刷新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.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
Quartz配置类主要包含以下三个步骤:
- 编写任务实现类
- 定义工作明细
- 绑定任务触发器
代码如下:
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 执行中...