0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

SpringBoot如何實(shí)現(xiàn)定時(shí)任務(wù)(上)

jf_78858299 ? 來(lái)源:博客園 ? 作者:Jae1995 ? 2023-04-07 14:51 ? 次閱讀

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();
 }
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 代碼
    +關(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
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    linux的循環(huán)定時(shí)任務(wù)

    linux循環(huán)定時(shí)任務(wù)
    發(fā)表于 05-20 14:59

    定時(shí)任務(wù)的發(fā)展史是怎么樣的

    定時(shí)任務(wù)是互聯(lián)網(wǎng)行業(yè)里最常用的服務(wù)之一,本文給大家介紹定時(shí)任務(wù)在我司的發(fā)展歷程。 linux系統(tǒng)中一般使用crontab命令來(lái)實(shí)現(xiàn),在Java世界里,使用最廣泛的就是quartz了。我司
    發(fā)表于 07-18 17:38 ?0次下載
    <b class='flag-5'>定時(shí)任務(wù)</b>的發(fā)展史是怎么樣的

    SpringBoot如何實(shí)現(xiàn)動(dòng)態(tài)增刪啟停定時(shí)任務(wù)

    在spring boot項(xiàng)目中,可以通過(guò) @EnableScheduling 注解和@Scheduled注解實(shí)現(xiàn)定時(shí)任務(wù),也可以通過(guò)SchedulingConfigurer接口來(lái)實(shí)現(xiàn)定時(shí)任務(wù)
    的頭像 發(fā)表于 09-24 09:49 ?2968次閱讀
    <b class='flag-5'>SpringBoot</b>如何<b class='flag-5'>實(shí)現(xiàn)</b>動(dòng)態(tài)增刪啟停<b class='flag-5'>定時(shí)任務(wù)</b>

    Python定時(shí)任務(wù)實(shí)現(xiàn)方式

    在日常工作中,我們常常會(huì)用到需要周期性執(zhí)行的任務(wù),一種方式是采用 Linux 系統(tǒng)自帶的 crond 結(jié)合命令行實(shí)現(xiàn)。另外一種方式是直接使用Python。接下來(lái)整理的是常見(jiàn)的Python定時(shí)任務(wù)
    的頭像 發(fā)表于 10-08 15:20 ?5846次閱讀

    如何在SpringBoot項(xiàng)目中實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù)

    之前寫(xiě)過(guò)文章記錄怎么在SpringBoot項(xiàng)目中簡(jiǎn)單使用定時(shí)任務(wù),不過(guò)由于要借助cron表達(dá)式且都提前定義好放在配置文件里,不能在項(xiàng)目運(yùn)行中動(dòng)態(tài)修改任務(wù)執(zhí)行時(shí)間,實(shí)在不太靈活。
    的頭像 發(fā)表于 09-30 11:16 ?1824次閱讀

    解析Golang定時(shí)任務(wù)庫(kù)gron設(shè)計(jì)和原理

    正巧,最近看到了 gron 這個(gè)開(kāi)源項(xiàng)目,它是用 Golang 實(shí)現(xiàn)一個(gè)并發(fā)安全的定時(shí)任務(wù)庫(kù)。實(shí)現(xiàn)非常簡(jiǎn)單精巧,代碼量也不多。今天我們就來(lái)一起結(jié)合源碼看一下,怎樣基于 Golang 的能力做出來(lái)一個(gè)【
    的頭像 發(fā)表于 12-15 13:57 ?1355次閱讀

    求一種SpringBoot定時(shí)任務(wù)動(dòng)態(tài)管理通用解決方案

    SpringBoot定時(shí)任務(wù)的加強(qiáng)工具,實(shí)現(xiàn)對(duì)SpringBoot原生的定時(shí)任務(wù)進(jìn)行動(dòng)態(tài)管理,完全兼容原生@Scheduled注解,無(wú)需對(duì)
    的頭像 發(fā)表于 02-03 09:49 ?802次閱讀

    SpringBoot如何實(shí)現(xiàn)定時(shí)任務(wù)(下)

    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ù)中讀取
    的頭像 發(fā)表于 04-07 14:51 ?1253次閱讀
    <b class='flag-5'>SpringBoot</b>如何<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>定時(shí)任務(wù)</b>(下)

    Spring Boot中整合兩種定時(shí)任務(wù)的方法

    在 Spring + SpringMVC 環(huán)境中,一般來(lái)說(shuō),要實(shí)現(xiàn)定時(shí)任務(wù),我們有兩中方案,一種是使用 Spring 自帶的定時(shí)任務(wù)處理器 @Scheduled 注解,另一種就是使用第三方
    的頭像 發(fā)表于 04-07 14:55 ?1581次閱讀
    Spring Boot中整合兩種<b class='flag-5'>定時(shí)任務(wù)</b>的方法

    在Spring Boot中如何使用定時(shí)任務(wù)

    本文介紹在 Spring Boot 中如何使用定時(shí)任務(wù),使用非常簡(jiǎn)單,就不做過(guò)多說(shuō)明了。
    的頭像 發(fā)表于 04-12 10:56 ?994次閱讀

    如何動(dòng)態(tài)添加修改刪除定時(shí)任務(wù)

    如何動(dòng)態(tài)添加修改刪除定時(shí)任務(wù)?那么我們一起看看具體怎么實(shí)現(xiàn),先看下本節(jié)大綱: (1)思路說(shuō)明; (2)代碼解析; (3)修改定時(shí)任務(wù)執(zhí)行周期特別說(shuō)明;
    的頭像 發(fā)表于 04-12 11:06 ?1097次閱讀

    Linux如何使用cron進(jìn)行定時(shí)任務(wù)的操作

    按計(jì)劃執(zhí)行命令對(duì)于計(jì)算機(jī)來(lái)說(shuō)非常重要,因?yàn)榧偃缥矣H自去執(zhí)行一些任務(wù)的話(huà),可能會(huì)因?yàn)槎喾矫嬉蛩夭荒馨磿r(shí)執(zhí)行,所以定時(shí)任務(wù)就顯得非常重要了! cron就是一個(gè)能夠執(zhí)行定時(shí)任務(wù)的命令,其實(shí)該命令本身不難,下面小編帶您詳細(xì)了解!
    的頭像 發(fā)表于 05-12 16:27 ?2079次閱讀

    python定時(shí)任務(wù)實(shí)踐

    由于程序需求,監(jiān)測(cè)配置變化需要設(shè)置定時(shí)任務(wù),每分鐘執(zhí)行一次,對(duì)任務(wù)持久化要求不高,不需要時(shí)可以關(guān)閉定時(shí)任務(wù)
    的頭像 發(fā)表于 05-20 17:53 ?992次閱讀
    python<b class='flag-5'>定時(shí)任務(wù)</b>實(shí)踐

    定時(shí)器如何實(shí)現(xiàn)定時(shí)任務(wù)

    1.1、單次定時(shí)任務(wù)實(shí)現(xiàn) boost 的asio庫(kù)里有幾個(gè)定時(shí)器,老的有 deadline_timer , 還有三個(gè)可配合 C++11 的 chrono
    的頭像 發(fā)表于 11-09 17:20 ?1001次閱讀

    linux定時(shí)任務(wù)的用法總結(jié)

    習(xí)慣了使用 windows 的計(jì)劃任務(wù),使用 linux 中的 crontab 管理定時(shí)任務(wù)時(shí)很不適應(yīng)。
    的頭像 發(fā)表于 08-14 18:16 ?881次閱讀
    linux<b class='flag-5'>定時(shí)任務(wù)</b>的用法總結(jié)