SpringBoot創建定時任務的方式很簡單,主要有兩種方式:一、基于注解的方式(@Scheduled)二、數據庫動態配置。實際開發中,第一種需要在代碼中寫死表達式,如果修改起來,又得重啟會顯得很麻煩;所以我們往往會采取第二種方式,可以直接從數據庫中讀取定時任務的指定執行時間,無需重啟。
下面就來介紹下這兩種方式吧
一、基于注解(@Scheduled)
基于注解是一種靜態的方式,只需要幾行代碼就可以搞定了
添加一個配置類
@Configuration //標記配置類
@EnableScheduling //開啟定時任務
public class MyScheduleConfig {
//添加定時任務
@Scheduled(cron = "0/5 * * * * ?")
private void myTasks() {
System.out.println("執行定時任務 " + LocalDateTime.now());
}
}
上面代碼的cron表達式表示每5秒執行一次,可以通過這個網站(https://qqe2.com/cron)去生成要的cron表達式
啟動應用,控制臺看效果
這個方式的確很簡單方便,但前面介紹也說到了,有個缺點就是當我們需要去修改定時任務的執行周期或者停止的時候,我們需要到代碼層去修改,重啟。
二、數據庫動態配置
這里使用MySQL數據庫
1、表數據添加,資源配置
1.1 添加表
CREATE TABLE `scheduled_job` (
`job_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵id',
`job_key` varchar(128) NOT NULL COMMENT '定時任務完整類名',
`cron_expression` varchar(20) NOT NULL COMMENT 'cron表達式',
`task_explain` varchar(50) NOT NULL DEFAULT '' COMMENT '任務描述',
`status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '狀態,1:正常;-1:停用',
PRIMARY KEY (`job_id`),
UNIQUE KEY `job_key` (`job_key`),
UNIQUE KEY `cron_key_unique_idx` (`job_key`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='定時任務表';
1.2 插入兩條數據,job_key根據是完整的類名
1.3 引入依賴
<dependency>
<groupId>org.springframework.boot<span class="hljs-name"groupId>
<artifactId>spring-boot-starter-web<span class="hljs-name"artifactId>
<span class="hljs-name"dependency>
<dependency>
<groupId>mysql<span class="hljs-name"groupId>
<artifactId>mysql-connector-java<span class="hljs-name"artifactId>
<version>5.1.49<span class="hljs-name"version>
<scope>runtime<span class="hljs-name"scope>
<span class="hljs-name"dependency>
<dependency>
<groupId>com.baomidou<span class="hljs-name"groupId>
<artifactId>mybatis-plus-boot-starter<span class="hljs-name"artifactId>
<version>3.3.1.tmp<span class="hljs-name"version>
<span class="hljs-name"dependency>
<dependency>
<groupId>org.projectlombok<span class="hljs-name"groupId>
<artifactId>lombok<span class="hljs-name"artifactId>
<version>1.18.20<span class="hljs-name"version>
<scope>provided<span class="hljs-name"scope>
<span class="hljs-name"dependency>
1.4 配置application.yml
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/test?userUnicode=true&characterEncoding=UTF8&useSSL=false
username: root
password: 123
driver-class-name: com.mysql.jdbc.Driver
server:
servlet:
context-path: /demo
port: 8888
2、瘋狂貼代碼
2.1 創建定時任務線程池
@Configuration
@Slf4j
public class ScheduledConfig {
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
log.info("創建定時任務調度線程池 start");
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(20);
threadPoolTaskScheduler.setThreadNamePrefix("taskExecutor-");
threadPoolTaskScheduler.setWaitForTasksToCompleteOnShutdown(true);
threadPoolTaskScheduler.setAwaitTerminationSeconds(60);
log.info("創建定時任務調度線程池 end");
return threadPoolTaskScheduler;
}
}
2.2 項目啟動時初始化定時任務
@Slf4j
@Component
public class ScheduledTaskRunner implements ApplicationRunner {
@Autowired
private ScheduledTaskService scheduledTaskService;
@Override
public void run(ApplicationArguments args) throws Exception {
log.info("----初始化定時任務開始----");
scheduledTaskService.initTask();
log.info("----初始化定時任務完成----");
}
}
2.3 定時任務公共接口
public interface ScheduledOfTask extends Runnable{
void execute();
@Override
default void run() {
execute();
}
}
2.4 創建兩個定時任務實現類
@Component
@Slf4j
public class TaskJob1 implements ScheduledOfTask{
@Override
public void execute() {
log.info("執行任務1 "+ LocalDateTime.now());
}
}
@Component
@Slf4j
public class TaskJob2 implements ScheduledOfTask{
@Override
public void execute() {
log.info("執行任務2 "+ LocalDateTime.now());
}
}
2.5 定時任務管理接口
public interface ScheduledTaskService{
Boolean start(ScheduledJob scheduledJob);
Boolean stop(String jobKey);
Boolean restart(ScheduledJob scheduledJob);
void initTask();
}
-
代碼
+關注
關注
30文章
4779瀏覽量
68525 -
spring
+關注
關注
0文章
340瀏覽量
14338 -
Boot
+關注
關注
0文章
149瀏覽量
35823 -
SpringBoot
+關注
關注
0文章
173瀏覽量
177
發布評論請先 登錄
相關推薦
評論