成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深入淺出 Spring @Scheduled 注解

開發
本文,我們分析了 Spring 的 @Scheduled? 注解,從基本的使用方法,到背后的工作原理。

今天我們來聊聊 Spring 框架中一個非常實用的功能——@Scheduled 注解。如果你在開發過程中遇到需要定時執行任務的需求,那么相信 @Scheduled 一定能幫上大忙。

一、什么是 @Scheduled?

簡單來說,@Scheduled 是 Spring 提供的一個注解,用于在方法上標記定時任務。通過它,我們可以輕松地在指定的時間間隔或特定的時間點執行某些代碼,而不需要引入額外的定時任務庫。

舉個例子:

假設你有一個方法需要每隔5分鐘執行一次,你只需要在方法上加上 @Scheduled 注解,并設置相應的屬性即可。

二、如何配置 @Scheduled?

在開始使用 @Scheduled 之前,我們需要做一些配置工作。首先,確保你的 Spring 項目中引入了 spring-boot-starter,因為它已經包含了必要的依賴。

1. 開啟定時任務支持

在你的主類(通常標注了 @SpringBootApplication 的類)上添加 @EnableScheduling 注解,以啟用定時任務的支持。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class ScheduledDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(ScheduledDemoApplication.class, args);
    }
}

2. 創建定時任務

接下來,我們創建一個服務類,并在其中定義一個定時任務方法。例如,每隔5秒打印一條消息:

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTasks {

    @Scheduled(fixedRate = 5000)
 public void reportCurrentTime() {
        System.out.println("每5秒執行一次任務,當前時間:" + System.currentTimeMillis());
    }
}

三、常用屬性

@Scheduled 注解提供了多種方式來配置定時任務的執行時間,主要包括以下幾種:

1. fixedRate

指定一個固定的時間間隔,以毫秒為單位,表示上一次任務開始執行后,多久再次執行。

@Scheduled(fixedRate = 5000) // 每5秒執行一次
public void fixedRateTask() {
    System.out.println("Fixed Rate Task - " + System.currentTimeMillis());
}

2. fixedDelay

指定一個固定的時間間隔,表示上一次任務執行完成后,等待多久再次執行。

@Scheduled(fixedDelay = 5000) // 上一次任務完成后5秒執行一次
public void fixedDelayTask() {
    System.out.println("Fixed Delay Task - " + System.currentTimeMillis());
}

3. cron

使用 cron 表達式確地指定任務的執行時間。cron 表達式可以讓你定義復雜的時間計劃。

@Scheduled(cron = "0 0/1 * * * ?") // 每分鐘執行一次
public void cronTask() {
    System.out.println("Cron Task - " + System.currentTimeMillis());
}

四、工作原理

了解了如何使用 @Scheduled,那么它背后到底是如何運作的呢?讓我們來深入探討一下。

1. 基于 TaskScheduler

Spring 的定時任務是基于 TaskScheduler 接口實現的。當我們在方法上使用 @Scheduled 注解時,Spring 會自動為其創建一個調度器,并按照我們定義的時間計劃來執行任務。

2. 使用 ThreadPoolTaskScheduler

默認情況下,Spring 使用 ThreadPoolTaskScheduler 作為 TaskScheduler 的實現類。它內部維護了一個線程池,用于執行定時任務。這樣可以確保多個定時任務能夠并發執行,而不會阻塞主線程。

注意: 如果你的應用中有多個定時任務,或者某些任務執行時間較長,建議自定義 ThreadPoolTaskScheduler 的線程池大小,以避免任務堆積或資源浪費。

3. 定時任務的執行流程

初始化階段: 啟動 Spring 應用時,@EnableScheduling 注解會觸發 Spring 的配置,掃描所有被 @Scheduled 注解標記的方法。

注冊任務: 所有符合條件的定時任務方法會被注冊到 TaskScheduler 中。

執行任務: 根據配置的時間計劃,TaskScheduler 會調度并在合適的線程中執行相應的任務方法。

五、延時執行的定時任務

為了更好地理解 @Scheduled 的使用,我們來實現一個稍微復雜些的示例——延時執行任務。

假設我們有一個任務需要在應用啟動后延時10秒執行一次,然后每隔5秒重復執行。

1. 創建定時任務類

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
publicclass DelayedScheduledTasks {

    privateboolean firstRun = true;

    @Scheduled(fixedRate = 5000, initialDelay = 10000)
    public void delayedTask() {
        if (firstRun) {
            System.out.println("延時10秒后首次執行任務,當前時間:" + System.currentTimeMillis());
            firstRun = false;
        } else {
            System.out.println("每5秒執行一次任務,當前時間:" + System.currentTimeMillis());
        }
    }
}

2. 解釋

fixedRate = 5000: 任務每5秒執行一次。

initialDelay = 10000: 應用啟動后,延時10秒首次執行任務。

六、自定義 TaskScheduler

有時候,默認的 ThreadPoolTaskScheduler 可能無法滿足我們的需求,比如需要更高的并發能力或特定的線程名稱模式。這時候,我們可以自定義一個 TaskScheduler Bean。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

@Configuration
publicclass SchedulerConfig {

    @Bean
    public ThreadPoolTaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(10); // 設置線程池大小
        scheduler.setThreadNamePrefix("MyScheduler-"); // 設置線程名稱前綴
        scheduler.initialize();
        return scheduler;
    }
}

通過上述配置,我們創建了一個擁有10個線程的線程池,并為每個線程命名,方便日志追蹤和調試。

七、總結

本文,我們分析了 Spring 的 @Scheduled 注解,從基本的使用方法,到背后的工作原理,再到一些實戰中的應用示例,@Scheduled 都能為我們的開發帶來極大的便利。

責任編輯:趙寧寧 來源: 猿java
相關推薦

2021-03-16 08:54:35

AQSAbstractQueJava

2022-01-12 08:54:52

Spring編程架構設計

2011-07-04 10:39:57

Web

2019-01-07 15:29:07

HadoopYarn架構調度器

2017-07-02 18:04:53

塊加密算法AES算法

2012-05-21 10:06:26

FrameworkCocoa

2021-07-20 15:20:02

FlatBuffers阿里云Java

2022-09-26 09:01:15

語言數據JavaScript

2020-05-27 20:25:47

SpringSpringBoot數據

2022-09-29 09:19:04

線程池并發線程

2009-11-30 16:46:29

學習Linux

2012-02-21 13:55:45

JavaScript

2022-01-11 07:52:22

CSS 技巧代碼重構

2018-11-09 16:24:25

物聯網云計算云系統

2019-11-11 14:51:19

Java數據結構Properties

2022-11-09 08:06:15

GreatSQLMGR模式

2022-12-02 09:13:28

SeataAT模式

2022-10-31 09:00:24

Promise數組參數

2019-12-04 10:13:58

Kubernetes存儲Docker

2009-11-18 13:30:37

Oracle Sequ
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲欧美一区二区在线观看 | 久久小视频 | 国产精品不卡一区 | 亚洲 91| 欧美激情视频一区二区三区在线播放 | 日韩精品在线播放 | 欧美一区二区三区一在线观看 | 欧美日韩免费在线 | 很黄很污的网站 | 国产精品视频在线播放 | 欧美成人在线影院 | 久久精品亚洲精品国产欧美kt∨ | 日韩精品一区二区三区中文在线 | 成人免费一区二区三区视频网站 | 一呦二呦三呦国产精品 | 久久精品日产第一区二区三区 | 热99| 色在线视频网站 | 一级片免费视频 | 成人中文字幕在线观看 | 成人免费视频网站在线观看 | 欧美 日韩 国产 成人 在线 91 | 国产高清免费在线 | 色综合99| 激情六月丁香婷婷 | 欧美色偷拍 | 一级黄色毛片子 | 久久国产精品色av免费观看 | 日韩av电影在线观看 | 91网站在线观看视频 | 亚洲 欧美 另类 综合 偷拍 | 91国在线 | 国产成人99久久亚洲综合精品 | 色综合一区二区三区 | 精品久久视频 | 自拍偷拍第一页 | 国产午夜精品视频 | 黑人巨大精品欧美一区二区免费 | 国产精品二区三区在线观看 | www精品美女久久久tv | hitomi一区二区三区精品 |