SpringBoot創(chuàng)建定時(shí)任務(wù)的方式很簡(jiǎn)單,主要有兩種方式:一、基于注解的方式(@Scheduled)二、數(shù)據(jù)庫(kù)動(dòng)態(tài)配置。實(shí)際開(kāi)發(fā)中,第一種需要在代碼中寫(xiě)死表達(dá)式,如果修改起來(lái),又得重啟會(huì)顯得很麻煩;所以我們往往會(huì)采取第二種方式,可以直接從數(shù)據(jù)庫(kù)中讀取定時(shí)任務(wù)的指定執(zhí)行時(shí)間,無(wú)需重啟。
下面就來(lái)介紹下這兩種方式吧
一、基于注解(@Scheduled)
基于注解是一種靜態(tài)的方式,只需要幾行代碼就可以搞定了
添加一個(gè)配置類(lèi)
@Configuration //標(biāo)記配置類(lèi)
@EnableScheduling //開(kāi)啟定時(shí)任務(wù)
public class MyScheduleConfig {
//添加定時(shí)任務(wù)
@Scheduled(cron = "0/5 * * * * ?")
private void myTasks() {
System.out.println("執(zhí)行定時(shí)任務(wù) " + LocalDateTime.now());
}
}
上面代碼的cron表達(dá)式表示每5秒執(zhí)行一次,可以通過(guò)這個(gè)網(wǎng)站(https://qqe2.com/cron)去生成要的cron表達(dá)式
啟動(dòng)應(yīng)用,控制臺(tái)看效果
這個(gè)方式的確很簡(jiǎn)單方便,但前面介紹也說(shuō)到了,有個(gè)缺點(diǎn)就是當(dāng)我們需要去修改定時(shí)任務(wù)的執(zhí)行周期或者停止的時(shí)候,我們需要到代碼層去修改,重啟。
二、數(shù)據(jù)庫(kù)動(dòng)態(tài)配置
這里使用MySQL數(shù)據(jù)庫(kù)
1、表數(shù)據(jù)添加,資源配置
1.1 添加表
CREATE TABLE `scheduled_job` (
`job_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵id',
`job_key` varchar(128) NOT NULL COMMENT '定時(shí)任務(wù)完整類(lèi)名',
`cron_expression` varchar(20) NOT NULL COMMENT 'cron表達(dá)式',
`task_explain` varchar(50) NOT NULL DEFAULT '' COMMENT '任務(wù)描述',
`status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '狀態(tài),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='定時(shí)任務(wù)表';
1.2 插入兩條數(shù)據(jù),job_key根據(jù)是完整的類(lèi)名
1.3 引入依賴(lài)
<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 創(chuàng)建定時(shí)任務(wù)線(xiàn)程池
@Configuration
@Slf4j
public class ScheduledConfig {
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
log.info("創(chuàng)建定時(shí)任務(wù)調(diào)度線(xiàn)程池 start");
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(20);
threadPoolTaskScheduler.setThreadNamePrefix("taskExecutor-");
threadPoolTaskScheduler.setWaitForTasksToCompleteOnShutdown(true);
threadPoolTaskScheduler.setAwaitTerminationSeconds(60);
log.info("創(chuàng)建定時(shí)任務(wù)調(diào)度線(xiàn)程池 end");
return threadPoolTaskScheduler;
}
}
2.2 項(xiàng)目啟動(dòng)時(shí)初始化定時(shí)任務(wù)
@Slf4j
@Component
public class ScheduledTaskRunner implements ApplicationRunner {
@Autowired
private ScheduledTaskService scheduledTaskService;
@Override
public void run(ApplicationArguments args) throws Exception {
log.info("----初始化定時(shí)任務(wù)開(kāi)始----");
scheduledTaskService.initTask();
log.info("----初始化定時(shí)任務(wù)完成----");
}
}
2.3 定時(shí)任務(wù)公共接口
public interface ScheduledOfTask extends Runnable{
void execute();
@Override
default void run() {
execute();
}
}
2.4 創(chuàng)建兩個(gè)定時(shí)任務(wù)實(shí)現(xiàn)類(lèi)
@Component
@Slf4j
public class TaskJob1 implements ScheduledOfTask{
@Override
public void execute() {
log.info("執(zhí)行任務(wù)1 "+ LocalDateTime.now());
}
}
@Component
@Slf4j
public class TaskJob2 implements ScheduledOfTask{
@Override
public void execute() {
log.info("執(zhí)行任務(wù)2 "+ LocalDateTime.now());
}
}
2.5 定時(shí)任務(wù)管理接口
public interface ScheduledTaskService{
Boolean start(ScheduledJob scheduledJob);
Boolean stop(String jobKey);
Boolean restart(ScheduledJob scheduledJob);
void initTask();
}
-
代碼
+關(guān)注
關(guān)注
30文章
4808瀏覽量
68815 -
spring
+關(guān)注
關(guān)注
0文章
340瀏覽量
14362 -
Boot
+關(guān)注
關(guān)注
0文章
150瀏覽量
35863 -
SpringBoot
+關(guān)注
關(guān)注
0文章
174瀏覽量
187
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論