[英]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.