我目前在我的 Spring 應用程式中有一個計劃任務。
然而,這個邏輯的兩個部分非常耗時,我想知道是否有辦法使這兩個部分異步,這樣它就不會干擾執行邏輯的時間。
我需要執行的邏輯如下。
@Scheduled(fixedDelay = 10000)
public void startAuction() throws Exception {
List<SchGoodsAuctionStartListRes> list = schedulerService.schGoodsAuctionStartList();
for (SchGoodsAuctionStartListRes item : list) {
schedulerService.schGoodsAuctionStart(item);
// 1st time consuming block that needs async
PushInfo pushInfo = pushMapper.pushGoodsSeller(item.getGoodsIdx());
pushInfo.setTitle("Start");
pushInfo.setBody("[" pushInfo.getBrand() "] started.");
pushInfo.setPushGrp("001");
pushInfo.setPushCode("003");
fcmPushUtil.sendPush(pushInfo);
// 2nd time consuming block that needs async
List<PushInfo> pushInfos = pushMapper.pushGoodsAuctionAll(item.getIdx());
for (PushInfo pushInfoItem : pushInfos) {
pushInfoItem.setTitle("\uD83D\uDD14 open");
pushInfoItem.setBody("[" pushInfo.getBrand() "] started. \uD83D\uDC5C");
pushInfoItem.setPushGrp("002");
pushInfoItem.setPushCode("008");
fcmPushUtil.sendPush(pushInfoItem);
}
}
}
據我了解,調度程式已經在異步執行邏輯,我想知道是否有任何方法可以使這兩個塊異步,以便在執行此邏輯時不會導致延遲。
任何形式的建議或反饋將不勝感激!
先感謝您!
uj5u.com熱心網友回復:
您可以在此處采用多種方法。
為 Spring 的計劃任務配置執行緒池執行器
默認情況下,Spring 使用單執行緒執行器來執行計劃任務,這意味著即使您有多個@Scheduled任務,或者在前一個任務完成之前觸發一個任務的另一個執行,它們都必須在佇列中等待。
您可以配置自己的執行程式以供 Spring 調度使用。看一下 的檔案@EnableScheduling,關于這個主題的內容非常詳盡。
要配置ExecutorService用于計劃任務,定義一個 bean 就足夠了:
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(8);
threadPoolTaskScheduler.setThreadNamePrefix("task-scheduler");
return threadPoolTaskScheduler;
}
此外,如果您使用 Spring Boot,則可以使用屬性檔案:
spring.task.scheduling.pool.size=8
異步執行計劃任務
要異步執行計劃任務,您可以使用 Spring 的@Async注釋(并確保@EnableAsync在配置中的某個位置。這將使您的任務在后臺執行緒上執行,從而釋放調度執行緒。
@EnableAsync
public class ScheduledAsyncTask {
@Async
@Scheduled(fixedRate = 10000)
public void scheduleFixedRateTaskAsync() throws InterruptedException {
// your task logic ...
}
}
將任務的昂貴部分卸載到不同的執行者
ExecutorService最后,您可以使用該執行器而不是用于任務調度的執行器來單獨運行任務的昂貴部分。這將使在 Spring 用于調度任務的執行緒上完成執行所需的時間保持在最低限度,從而允許它開始下一次執行。
public class ScheduledAsyncTask implements DisposableBean {
private final ExecutorService executorService = Executors.newFixedThreadPool(4);
@Scheduled(fixedRate = 10000)
public void scheduleFixedRateTaskAsync() throws InterruptedException {
executorService.submit(() -> {
// Expensive calculations ...
});
}
@Override
public void destroy() {
executorService.shutdown();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/498350.html
