簡體   English   中英

使用 spring 調度任務

[英]Scheduling a task with spring

我正在為我的 Web 應用程序使用 java Spring 框架,我想安排一個任務在特定時間在服務器中運行。 時間由應用程序的用戶提供。

我查看了TaskScheduler ,我發現了這樣的例子,

@Configuration
@EnableAsync
@EnableScheduling
public class MyComponent {

    @Async
    @Scheduled(fixedDelay=5000)
    public void doSomething() {
       System.out.println("Scheduled Task");
    }
}

相同的任務以固定的時間間隔一遍又一遍地發生。 它每 5 秒打印一次“計划任務”。但我只想打印一次(例如:上午 11.35)

任何人都可以幫助我。

如果您只想運行任務一次,那么您必須提供 cron 表達式,使其包含整個日期和時間(包括年份),以便它只匹配一次。

最簡單的修復,可能不適合練習

簡單的解決方法是在您的方法中添加一個 if 語句,並且僅在當前時間與您想要打印的時間匹配時才打印。

Java 並不總是有最好的時間/日期實現,但從 Java 8 開始,有一個名為LocalDateTime的新庫,它運行良好。 我認為使用它是這個簡單解決方案的最佳選擇。

下面是使用LocalDateTime獲取當前小時、分鍾和秒的示例。 年、月、日等也有類似的方法。

LocalDateTime now = LocalDateTime.now();
int hour = now.getHour();
int minute = now.getMinute();
int second = now.getSecond();

我們可以將它與您當前的代碼結合起來,只在您希望的時候執行打印語句:

@Configuration
@EnableAsync
@EnableScheduling
public class MyComponent {

    @Async
    @Scheduled(fixedDelay=5000)
    public void doSomething() {

        LocalDateTime now = LocalDateTime.now();
        int hour = now.getHour();
        int minute = now.getMinute();
        int second = now.getSecond();

        if(hour == 10 &&
           minute == 34 &&
           second < 6) {

            System.out.println("Scheduled Task");

        }
 
    }

}

您將小時與 10 進行比較,將分鍾與 34 進行比較,因為這些函數返回一個從 0 到 n-1 的數字,其中 n 是一天中的小時數或一小時中的分鍾數。 您將 second 與 <6 進行比較,以便無論此作業何時開始(因為它每 5 秒執行一次),您將始終在每天上午 11:35 至少打印一次。


我絕對不是要建議這是最好的選擇,但這絕對是一個選擇。 每 5 秒創建一個 LocalDateTime 的新實例並不理想,但如果資源不是問題,那就沒問題了。

這不是最漂亮或設計最好的解決方案,但它有效。 如果您只想要一個快速的解決方案並且您不關心完成此任務的正確“實踐”,那么這是一個選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM