springboot 中每分鐘執行一次的 cron 表示式怎麼寫

gongchengship發表於2024-07-04

在Spring Boot中,如果你需要使用Cron表示式來每分鐘執行一次任務,可以使用Spring的@Scheduled註解。Cron表示式是一種用來表示時間點的字串,透過這些字串,你可以非常靈活地定義任務的執行時間。

Cron表示式格式

Cron表示式由六個或七個欄位組成,按以下順序排列:

  1. 秒(Seconds): 0-59
  2. 分鐘(Minutes): 0-59
  3. 小時(Hours): 0-23
  4. 日期(Day of month): 1-31
  5. 月份(Month): 1-12 或者 JAN-DEC
  6. 星期(Day of week): 0-7 或者 SUN-SAT(0 和 7 都是星期天)
  7. 年(可選,Year): 1970-2099

每分鐘執行一次的Cron表示式

要每分鐘執行一次,可以使用以下Cron表示式:

* * * * * *

解釋:

  • 第一個 * 表示每秒。
  • 第二個 * 表示每分鐘。
  • 第三個 * 表示每小時。
  • 第四個 * 表示每個月的每一天。
  • 第五個 * 表示每個月。
  • 第六個 * 表示每週的每一天。

在Spring Boot中使用Cron表示式

以下是一個示例,展示如何在Spring Boot中配置一個每分鐘執行一次的任務。

  1. 確保在Spring Boot應用中啟用了排程支援。在你的主應用程式類上新增@EnableScheduling註解:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}
  1. 建立一個排程任務類,並使用@Scheduled註解定義任務執行時間:
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class MyScheduledTask {

    @Scheduled(cron = "* * * * * *")
    public void executeTask() {
        System.out.println("Task executed at: " + new java.util.Date());
    }
}

詳細解釋

  • @Component: 標註這個類為Spring管理的元件,使其可以被Spring上下文掃描到。
  • @Scheduled(cron = "* * * * * *"): 標記方法為一個定時任務,使用Cron表示式定義執行時間。這裡表示每分鐘執行一次。

實踐中的考慮

  • 應用效能:頻繁執行的任務可能會對系統效能產生影響,確保任務的執行時間在可以接受的範圍內。
  • 錯誤處理:確保定時任務中的邏輯有充分的錯誤處理和日誌記錄,以便在任務失敗時進行追蹤和修復。
  • 任務狀態監控:可以結合Spring Boot Actuator或其他監控工具對定時任務的執行情況進行監控。

這樣配置後,你的Spring Boot應用將每分鐘執行一次executeTask方法中的任務。


那麼每分鐘執行一次的cron定時任務,它第一次執行是第1秒還是第61秒呢?

在Spring Boot中使用@Scheduled註解配置的Cron表示式來每分鐘執行一次任務時,任務將會在每分鐘的第0秒執行。因此,任務第一次執行是在應用啟動後的第一個整分鐘(即第0秒),而不是第61秒。

每分鐘執行一次的Cron表示式

為了確保每分鐘執行一次任務,你可以使用以下Cron表示式:

@Scheduled(cron = "0 * * * * *")
public void executeTask() {
    System.out.println("Task executed at: " + new java.util.Date());
}

解釋

  • 0 表示秒欄位,即在每分鐘的第0秒執行任務。
  • * 表示分鐘欄位,即每分鐘。
  • 其他欄位也使用 *,表示每小時、每天、每月和每週的每一天。

示例程式碼

以下是完整的示例,展示如何在Spring Boot應用中配置和使用這個Cron表示式:

主應用程式類

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

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

定時任務類

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

@Component
public class MyScheduledTask {

    @Scheduled(cron = "0 * * * * *")
    public void executeTask() {
        System.out.println("Task executed at: " + new java.util.Date());
    }
}

行為描述

  1. 應用啟動:當Spring Boot應用啟動後,Spring會掃描帶有@Scheduled註解的方法,並根據Cron表示式來排程這些任務。
  2. 第一次執行:任務將在每分鐘的第0秒執行。因此,第一次執行會在應用啟動後的第一個整分鐘的第0秒。
  3. 後續執行:任務將繼續在每分鐘的第0秒執行。

示例時間點

假設應用在 12:34:45 啟動:

  • 第一次執行時間:12:35:00
  • 第二次執行時間:12:36:00
  • 以此類推,每分鐘的第0秒。

總結

在Spring Boot中使用@Scheduled(cron = "0 * * * * *")配置每分鐘執行一次的任務時,任務會在每分鐘的第0秒執行。任務第一次執行是在應用啟動後的第一個整分鐘的第0秒,而不是第61秒。

相關文章