最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot項(xiàng)目使用@Scheduled注解實(shí)現(xiàn)定時(shí)任務(wù)的方法

 更新時(shí)間:2025年03月11日 11:04:45   作者:Eternitysy  
文章介紹了在SpringBoot項(xiàng)目中使用@Scheduled注解實(shí)現(xiàn)定時(shí)任務(wù)的三種方式:基于注解、基于接口和基于注解設(shè)定多線程定時(shí)任務(wù),詳細(xì)講解了@Scheduled注解的使用方法、各個(gè)參數(shù)以及如何配置動(dòng)態(tài)定時(shí)任務(wù)和多線程定時(shí)任務(wù),感興趣的朋友一起看看吧

SpringBoot項(xiàng)目【使用@Scheduled注解實(shí)現(xiàn)定時(shí)任務(wù)】

使用SpringBoot創(chuàng)建定時(shí)任務(wù)目前主要有以下三種創(chuàng)建方式:

1、基于注解(@Scheduled)

- 最簡(jiǎn)單直接
2、基于接口(SchedulingConfigurer)

- 適于實(shí)際使用中從數(shù)據(jù)庫(kù)中讀取指定時(shí)間來(lái)動(dòng)態(tài)執(zhí)行定時(shí)任務(wù)
3、基于注解設(shè)定多線程定時(shí)任務(wù)

1. 基于注解(@Scheduled)

1.1 @Scheduled 注解和 @EnableScheduling 注解的使用

基于注解@Scheduled默認(rèn)為單線程,開(kāi)啟多個(gè)任務(wù)時(shí),任務(wù)的執(zhí)行會(huì)受上一個(gè)任務(wù)執(zhí)行時(shí)間影響

@EnableScheduling注解: 在配置類上使用,開(kāi)啟計(jì)劃任務(wù)的支持(類上)。

@Scheduled注解: 來(lái)聲明這是一個(gè)任務(wù),包括 cron,fixDelay,fixRate 等類型(方法上,需先開(kāi)啟計(jì)劃任務(wù)的支持)。

【示例】SpringBoot項(xiàng)目中使用@Scheduled注解和@EnableScheduling注解實(shí)現(xiàn)定時(shí)任務(wù)。

(1)開(kāi)啟定時(shí)任務(wù)

SpringBoot 項(xiàng)目在項(xiàng)目啟動(dòng)類上添加 @EnableScheduling 注解即可開(kāi)啟定時(shí)任務(wù)管理。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling //開(kāi)啟定時(shí)任務(wù)
public class ScheduledDemoApplication
{
    public static void main(String[] args)
    {
        SpringApplication.run(ScheduledDemoApplication.class, args);
    }
}

(2)創(chuàng)建定時(shí)任務(wù)

創(chuàng)建定時(shí)任務(wù),并使用 @Scheduled 注解。

package com.pjb.Schedule;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
 * 定時(shí)任務(wù)的使用
 * @author pan_junbiao
 **/
@Component
public class Task
{
    @Scheduled(cron="0/5 * *  * * ? ")   //每5秒執(zhí)行一次
    public void execute(){
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //設(shè)置日期格式
        System.out.println("歡迎訪問(wèn) pan_junbiao的博客 " + df.format(new Date()));
    }
}

1.2 @Scheduled 注解各參數(shù)講解

@Scheduled 注解具有多個(gè)參數(shù),以下是常用的幾個(gè)參數(shù):

cron

接收一個(gè) cron 表達(dá)式。cron 表達(dá)式由六個(gè)或七個(gè)域組成,常見(jiàn)的格式如下:

css
復(fù)制編輯
[秒] [分] [小時(shí)] [日] [月] [周] [年]

序號(hào)說(shuō)明是否必填允許填寫(xiě)的值允許的通配符
10-59, - * /
20-59, - * /
3小時(shí)0-23, - * /
41-31, - * ? / L W
51-12 or JAN-DEC, - * /
61-7 or SUN-SAT, - * ? / L #
7空或1970-2099, - * /

通配符說(shuō)明:

? 表示不指定值。使用的場(chǎng)景為不需要關(guān)心當(dāng)前設(shè)置這個(gè)字段的值。例如:要在每月的10號(hào)觸發(fā)一個(gè)操作,但不關(guān)心是周幾,所以需要周位置的那個(gè)字段設(shè)置為"?" 具體設(shè)置為 0 0 0 10 * ?

-表示區(qū)間。例如 在小時(shí)上設(shè)置 “10-12”,表示 10,11,12點(diǎn)都會(huì)觸發(fā)。

, 表示指定多個(gè)值,例如在周字段上設(shè)置 “MON,WED,FRI” 表示周一,周三和周五觸發(fā)

/ 用于遞增觸發(fā)。如在秒上面設(shè)置"5/15" 表示從5秒開(kāi)始,每增15秒觸發(fā)(5,20,35,50)。在月字段上設(shè)置’1/3’所示每月1號(hào)開(kāi)始,每隔三天觸發(fā)一次。

L 表示最后的意思。在日字段設(shè)置上,表示當(dāng)月的最后一天(依據(jù)當(dāng)前月份,如果是二月還會(huì)依據(jù)是否是潤(rùn)年[leap]), 在周字段上表示星期六,相當(dāng)于"7"或"SAT"。如果在"L"前加上數(shù)字,則表示該數(shù)據(jù)的最后一個(gè)。例如在周字段上設(shè)置"6L"這樣的格式,則表示“本月最后一個(gè)星期五"

W 表示離指定日期的最近那個(gè)工作日(周一至周五). 例如在日字段上設(shè)置"15W",表示離每月15號(hào)最近的那個(gè)工作日觸發(fā)。(注,“W"前只能設(shè)置具體的數(shù)字,不允許區(qū)間”-")

常用示例:

定時(shí)任務(wù)表達(dá)式描述
0 0 12 * * ?每天12點(diǎn)觸發(fā)
0 15 10 ? * *每天10點(diǎn)15分觸發(fā)
0 15 10 * * ?每天10點(diǎn)15分觸發(fā)
0 15 10 * * ? *每天10點(diǎn)15分觸發(fā)
0 15 10 * * ? 20252025年每天10點(diǎn)15分觸發(fā)
0 * 14 * * ?每天下午的 2點(diǎn)到2點(diǎn)59分每分觸發(fā)
0 0/5 14 * * ?每天下午的 2點(diǎn)到2點(diǎn)59分(整點(diǎn)開(kāi)始,每隔5分觸發(fā))
0 0/5 14,18 * * ?每天下午的 2點(diǎn)到2點(diǎn)59分(整點(diǎn)開(kāi)始,每隔5分觸發(fā))每天下午的 18點(diǎn)到18點(diǎn)59分(整點(diǎn)開(kāi)始,每隔5分觸發(fā))
0 0-5 14 * * ?每天下午的 2點(diǎn)到2點(diǎn)05分每分觸發(fā)
0 10,44 14 ? 3 WED3月分每周三下午的 2點(diǎn)10分和2點(diǎn)44分觸發(fā)
0 15 10 ? * MON-FRI從周一到周五每天上午的10點(diǎn)15分觸發(fā)
0 15 10 15 * ?每月15號(hào)上午10點(diǎn)15分觸發(fā)
0 15 10 L * ?每月最后一天的10點(diǎn)15分觸發(fā)
0 15 10 ? * 6L每月最后一周的星期五的10點(diǎn)15分觸發(fā)
0 15 10 ? * 6L 2022-2025從2022年到2025年每月最后一周的星期五的10點(diǎn)15分觸發(fā)
0 15 10 ? * 6#3每月的第三周的星期五開(kāi)始觸發(fā)
0 0 12 1/5 * ?每月的第一個(gè)中午開(kāi)始每隔5天觸發(fā)一次
0 11 11 11 11 ?每年的11月11號(hào) 11點(diǎn)11分觸發(fā)(光棍節(jié))

其他常用

  • fixedDelay: 上次任務(wù)完成后多少毫秒再執(zhí)行。
  • fixedRate: 上次任務(wù)開(kāi)始后多少毫秒再執(zhí)行。
  • initialDelay: 第一次延遲多少毫秒后再執(zhí)行。

2. 動(dòng)態(tài)定時(shí)任務(wù):基于接口(SchedulingConfigurer)

2.1 創(chuàng)建數(shù)據(jù)庫(kù)表

在 MySQL 數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè) cron 表,存儲(chǔ)定時(shí)任務(wù)的 cron 表達(dá)式:

DROP TABLE IF EXISTS cron;
CREATE TABLE cron (
    cron_id VARCHAR(30) NOT NULL PRIMARY KEY,
    cron VARCHAR(30) NOT NULL
);
INSERT INTO cron VALUES ('1', '0/5 * * * * ?');

2.2 添加 MyBatis 依賴

pom.xml 中添加 MyBatis 和 MySQL 的 JDBC 依賴:

<!-- MyBatis與SpringBoot整合依賴 -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.3</version>
</dependency>
<!-- MySQL的JDBC數(shù)據(jù)庫(kù)驅(qū)動(dòng) -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.20</version>
</dependency>

2.3 創(chuàng)建定時(shí)任務(wù)配置類

package com.pjb.config;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.util.StringUtils;
import java.time.LocalDateTime;
/**
 * 動(dòng)態(tài)定時(shí)任務(wù)配置類
 * @author pan_junbiao
 **/
@Configuration
@EnableScheduling
public class DynamicScheduleConfigurer implements SchedulingConfigurer {
    @Mapper
    public interface CronMapper {
        @Select("select cron from cron limit 1")
        public String getCron();
    }
    @Autowired
    CronMapper cronMapper;
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addTriggerTask(
                () -> System.out.println("歡迎訪問(wèn) pan_junbiao的博客: " + LocalDateTime.now().toLocalTime()),
                triggerContext -> {
                    String cron = cronMapper.getCron();
                    if (StringUtils.isEmpty(cron)) {
                        // 錯(cuò)誤處理
                    }
                    return new CronTrigger(cron).nextExecutionTime(triggerContext);
                }
        );
    }
}

3. 基于注解設(shè)定多線程定時(shí)任務(wù)

通過(guò) @Async 注解開(kāi)啟多線程定時(shí)任務(wù),解決多個(gè)任務(wù)執(zhí)行時(shí)相互影響的問(wèn)題。

創(chuàng)建多線程定時(shí)任務(wù)

package com.pjb.Task;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
/**
 * 基于注解設(shè)定多線程定時(shí)任務(wù)
 * @author pan_junbiao
 */
@Component
@EnableScheduling   // 開(kāi)啟定時(shí)任務(wù)
@EnableAsync        // 開(kāi)啟多線程
public class MultithreadScheduleTask {
    @Async
    @Scheduled(fixedDelay = 1000)  // 間隔1秒
    public void first() throws InterruptedException {
        System.out.println("第一個(gè)定時(shí)任務(wù)開(kāi)始 : " + LocalDateTime.now().toLocalTime() + "\r\n線程 : " + Thread.currentThread().getName());
        Thread.sleep(1000 * 10);
    }
    @Async
    @Scheduled(fixedDelay = 2000)
    public void second() {
        System.out.println("第二個(gè)定時(shí)任務(wù)開(kāi)始 : " + LocalDateTime.now().toLocalTime() + "\r\n線程 : " + Thread.currentThread().getName());
    }
}

注意

由于 @Scheduled 默認(rèn)是單線程模式,開(kāi)啟多個(gè)定時(shí)任務(wù)時(shí)任務(wù)的執(zhí)行順序會(huì)受前一個(gè)任務(wù)的執(zhí)行時(shí)間影響。通過(guò) @Async 注解,我們可以解決這個(gè)問(wèn)題,使多個(gè)定時(shí)任務(wù)并行執(zhí)行。

通過(guò)以上三種方式,Spring Boot 提供了靈活的定時(shí)任務(wù)支持,可以根據(jù)項(xiàng)目需求選擇合適的實(shí)現(xiàn)方式。

到此這篇關(guān)于SpringBoot項(xiàng)目使用@Scheduled注解實(shí)現(xiàn)定時(shí)任務(wù)的文章就介紹到這了,更多相關(guān)SpringBoot @Scheduled定時(shí)任務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • WebService教程詳解(二)

    WebService教程詳解(二)

    這篇文章主要介紹了WebService教程詳解(二) 的相關(guān)資料,需要的朋友可以參考下
    2016-03-03
  • Netty分布式高性能工具類FastThreadLocal和Recycler分析

    Netty分布式高性能工具類FastThreadLocal和Recycler分析

    這篇文章主要為大家介紹了Netty分布式高性能工具類FastThreadLocal和Recycler分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • Java Web最近面試題匯總

    Java Web最近面試題匯總

    在本篇文章里小編給大家整理的是一篇關(guān)于Java Web最近面試題匯總內(nèi)容,需要的朋友們可以學(xué)習(xí)下。
    2020-02-02
  • Java Socket+多線程實(shí)現(xiàn)多人聊天室功能

    Java Socket+多線程實(shí)現(xiàn)多人聊天室功能

    這篇文章主要為大家詳細(xì)介紹了Java Socket+多線程實(shí)現(xiàn)多人聊天室功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Java多線程之徹底搞懂線程池

    Java多線程之徹底搞懂線程池

    熟悉 Java 多線程編程的同學(xué)都知道,當(dāng)我們線程創(chuàng)建過(guò)多時(shí),容易引發(fā)內(nèi)存溢出,因此我們就有必要使用線程池的技術(shù)了。想要詳細(xì)了解的同學(xué)可以參考閱讀本文
    2023-03-03
  • Springquartz的配置方式詳解

    Springquartz的配置方式詳解

    本文介紹了在Spring框架中使用Quartz進(jìn)行任務(wù)調(diào)度的三種方式:使用@Scheduled注解、XML配置和Java配置,每種方式都有其特點(diǎn)和適用場(chǎng)景,感興趣的朋友一起看看吧
    2025-01-01
  • Spring MVC 文件上傳下載的實(shí)例

    Spring MVC 文件上傳下載的實(shí)例

    本篇文章主要介紹了Spring MVC 文件上傳下載的實(shí)例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • Java實(shí)現(xiàn)優(yōu)雅日期處理的方案詳解

    Java實(shí)現(xiàn)優(yōu)雅日期處理的方案詳解

    在我們的日常工作中,需要經(jīng)常處理各種格式,各種類似的的日期或者時(shí)間,下面我們就來(lái)看看如何使用java處理這樣的日期問(wèn)題吧,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-04-04
  • jdk17+springboot使用webservice的踩坑實(shí)戰(zhàn)記錄

    jdk17+springboot使用webservice的踩坑實(shí)戰(zhàn)記錄

    這篇文章主要給大家介紹了關(guān)于jdk17+springboot使用webservice踩坑的相關(guān)資料,網(wǎng)上很多教程是基于jdk8的,所以很多在17上面跑不起來(lái),折騰兩天,直接給答案,需要的朋友可以參考下
    2024-01-01
  • Java sha1散列算法原理及代碼實(shí)例

    Java sha1散列算法原理及代碼實(shí)例

    這篇文章主要介紹了Java sha1散列算法原理及代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09

最新評(píng)論

江永县| 陆川县| 依兰县| 乐山市| 抚远县| 萝北县| 内丘县| 利川市| 牡丹江市| 萍乡市| 新乡市| 玛曲县| 静安区| 新和县| 阿尔山市| 永嘉县| 汉沽区| 靖宇县| 噶尔县| 嘉义市| 延津县| 库伦旗| 田东县| 西青区| 社旗县| 寻乌县| 博爱县| 黔西| 洛宁县| 广灵县| 民县| 司法| 永嘉县| 三河市| 洱源县| 德化县| 灵石县| 双峰县| 琼中| 锡林郭勒盟| 永善县|