自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

深入淺出 Spring @Scheduled 注解

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

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

一、什么是 @Scheduled?

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

舉個例子:

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

二、如何配置 @Scheduled?

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

1. 開啟定時任務(wù)支持

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

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. 創(chuàng)建定時任務(wù)

接下來,我們創(chuàng)建一個服務(wù)類,并在其中定義一個定時任務(wù)方法。例如,每隔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秒執(zhí)行一次任務(wù),當(dāng)前時間:" + System.currentTimeMillis());
    }
}

三、常用屬性

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

1. fixedRate

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

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

2. fixedDelay

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

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

3. cron

使用 cron 表達式確地指定任務(wù)的執(zhí)行時間。cron 表達式可以讓你定義復(fù)雜的時間計劃。

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

四、工作原理

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

1. 基于 TaskScheduler

Spring 的定時任務(wù)是基于 TaskScheduler 接口實現(xiàn)的。當(dāng)我們在方法上使用 @Scheduled 注解時,Spring 會自動為其創(chuàng)建一個調(diào)度器,并按照我們定義的時間計劃來執(zhí)行任務(wù)。

2. 使用 ThreadPoolTaskScheduler

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

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

3. 定時任務(wù)的執(zhí)行流程

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

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

執(zhí)行任務(wù): 根據(jù)配置的時間計劃,TaskScheduler 會調(diào)度并在合適的線程中執(zhí)行相應(yīng)的任務(wù)方法。

五、延時執(zhí)行的定時任務(wù)

為了更好地理解 @Scheduled 的使用,我們來實現(xiàn)一個稍微復(fù)雜些的示例——延時執(zhí)行任務(wù)。

假設(shè)我們有一個任務(wù)需要在應(yīng)用啟動后延時10秒執(zhí)行一次,然后每隔5秒重復(fù)執(zhí)行。

1. 創(chuàng)建定時任務(wù)類

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秒后首次執(zhí)行任務(wù),當(dāng)前時間:" + System.currentTimeMillis());
            firstRun = false;
        } else {
            System.out.println("每5秒執(zhí)行一次任務(wù),當(dāng)前時間:" + System.currentTimeMillis());
        }
    }
}

2. 解釋

fixedRate = 5000: 任務(wù)每5秒執(zhí)行一次。

initialDelay = 10000: 應(yīng)用啟動后,延時10秒首次執(zhí)行任務(wù)。

六、自定義 TaskScheduler

有時候,默認的 ThreadPoolTaskScheduler 可能無法滿足我們的需求,比如需要更高的并發(fā)能力或特定的線程名稱模式。這時候,我們可以自定義一個 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); // 設(shè)置線程池大小
        scheduler.setThreadNamePrefix("MyScheduler-"); // 設(shè)置線程名稱前綴
        scheduler.initialize();
        return scheduler;
    }
}

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

七、總結(jié)

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

責(zé)任編輯:趙寧寧 來源: 猿java
相關(guān)推薦

2011-07-04 10:39:57

Web

2021-03-16 08:54:35

AQSAbstractQueJava

2022-01-12 08:54:52

Spring編程架構(gòu)設(shè)計

2020-05-27 20:25:47

SpringSpringBoot數(shù)據(jù)

2022-09-26 09:01:15

語言數(shù)據(jù)JavaScript

2022-09-29 09:19:04

線程池并發(fā)線程

2017-07-02 18:04:53

塊加密算法AES算法

2019-01-07 15:29:07

HadoopYarn架構(gòu)調(diào)度器

2021-07-20 15:20:02

FlatBuffers阿里云Java

2012-05-21 10:06:26

FrameworkCocoa

2011-01-27 10:11:46

J2EEjavaspring

2009-11-17 17:31:58

Oracle COMM

2021-07-19 11:54:15

MySQL優(yōu)先隊列

2023-12-04 13:22:00

JavaScript異步編程

2010-07-26 12:57:12

OPhone游戲開發(fā)

2016-10-14 13:53:05

JavascriptDOMWeb

2016-10-14 14:32:58

JavascriptDOMWeb

2010-07-16 09:11:40

JavaScript內(nèi)存泄漏

2024-01-09 12:05:24

SSH協(xié)議端口

2009-11-30 16:46:29

學(xué)習(xí)Linux
點贊
收藏

51CTO技術(shù)棧公眾號