一剑辫、序言
- 靜態(tài)定時(shí)任務(wù):基于注解方式(@Scheduled)
動(dòng)態(tài)定時(shí)任務(wù):基于接口方式(SchedulingConfigurer)
多線程定時(shí)任務(wù):基于注解(@Async)
二嚎研、靜態(tài)定時(shí)任務(wù)
1.在啟動(dòng)類SpringBootApplication加注解@EnableScheduling
啟動(dòng)類注解
2.task代碼如下:
@Configuration
@EnableScheduling
public class StaticTask {
@Scheduled(cron ="0/5 * * * * ?")
public void taskTest(){
System.out.println("task靜態(tài)定時(shí)任務(wù)開始執(zhí)行"+ LocalDateTime.now());
}
}
3.用處:多用于項(xiàng)目啟動(dòng)后就不做修改塑荒,不對定時(shí)時(shí)間做修改
三、動(dòng)態(tài)定時(shí)任務(wù)
- 基于接口的定時(shí)任務(wù):SchedulingConfigurer火邓,在項(xiàng)目中最多使用,cron表達(dá)式在mysql數(shù)據(jù)庫中存儲,人為動(dòng)態(tài)控制任務(wù)執(zhí)行時(shí)間間隔泉蝌。
實(shí)現(xiàn)如下:
1.導(dǎo)入相對應(yīng)的pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mybatis起步依賴-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!--MYSQL依賴包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--druid數(shù)據(jù)庫連接池起步依賴-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.16</version>
</dependency>
2.application.yml配置文件
自行修改數(shù)據(jù)庫配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
initial-size: 5
min-idle: 5
max-active: 20
max-wait: 60000
3.數(shù)據(jù)庫sql
DROP DATABASE IF EXISTS `test`;
CREATE DATABASE `test`;
USE `test`;
DROP TABLE IF EXISTS `tb_cron`;
CREATE TABLE `tb_cron` (
`cron_id` varchar(30) NOT NULL PRIMARY KEY,
`cron` varchar(30) NOT NULL
);
INSERT INTO `tb_cron` VALUES ('1', '0/5 * * * * ?');
4.代碼實(shí)現(xiàn)
@Configuration
@EnableScheduling
public class DynamicTask implements SchedulingConfigurer {
//初始化cron表達(dá)式
public static String cron;
//注入mapper
@Autowire
private CronMapper cronMapper;
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
Cron cronObject = cronMapper.selectByPrimaryKey("1");
//cron表達(dá)式
cron = cronObject.getCron();
//任務(wù)線程
Runnable task =new Runnable() {
@Override
public void run() {
System.out.println("task動(dòng)態(tài)定時(shí)任務(wù)開始執(zhí)行"+ LocalDateTime.now());
}
};
//觸發(fā)器
Trigger trigger =new Trigger() {
@Override
public DatenextExecutionTime(TriggerContext triggerContext) {
//查詢cron表達(dá)式
cron =cronMapper.selectByPrimaryKey("1").getCron();
CronTrigger cronTrigger =new CronTrigger(cron);
Date nextExecuionTime = cronTrigger.nextExecutionTime(triggerContext);
return nextExecuionTime;
}
};
scheduledTaskRegistrar.addTriggerTask(task,trigger);
}
}
5.實(shí)現(xiàn)效果
動(dòng)態(tài)定時(shí)任務(wù)效果圖
四、多線程定時(shí)任務(wù)
1.基于Async注解實(shí)現(xiàn)多任務(wù)線程
@Configuration
@EnableScheduling
@EnableAsync
public class MultiThreadTask {
@Scheduled(cron ="0/2 * * * * ?")
@Async
public void test1(){
System.out.println("第一個(gè)定時(shí)任務(wù)開始 : " + LocalDateTime.now().toLocalTime() +"線程 : " + Thread.currentThread().getName());
}
@Scheduled(cron ="0/3 * * * * ?")
@Async
public void test2(){
System.out.println("第二個(gè)定時(shí)任務(wù)開始 : " + LocalDateTime.now().toLocalTime() +"線程 : " + Thread.currentThread().getName());
}
}
2.實(shí)現(xiàn)效果
多線程定時(shí)任務(wù)