我有一個呼叫相同私有方法的 Spring 調度任務。我需要同步這個方法嗎?如果同時運行分流任務,我會遇到問題嗎?或者將它提取到原型組件或單獨的調度類或其他東西會更好?
public class SomeScheduled {
private final RequestDispatcher requestDispatcher;
private final ErrorRegisterRepository errorRegisterRepository;
@Scheduled(cron = "0 0/4 * * * ?")
public void runRetry4minute() {
runRetry(Duration.of(4, ChronoUnit.MINUTES), 1);
}
@Scheduled(cron = "0 0/11 * * * ?")
public void runRetry11minute() {
runRetry(Duration.of(11, ChronoUnit.MINUTES), 2);
}
@Scheduled(cron = "0 0/29 * * * ?")
public void runRetry29minute() {
runRetry(Duration.of(29, ChronoUnit.MINUTES), 3);
}
private void runRetry(TemporalAmount time, int someField) {
LocalDateTime dateTime = LocalDateTime.now().minus(time);
Page<ErrorRegister> page;
int pageNum = 0;
do {
page = errorRegisterRepository.findBySomeCriteriaAndUpdatedAtBefore(someField, dateTime, PageRequest.of(pageNum, 500)); // Spring Data Jpa
page.get().forEach(errorRegister ->
requestDispatcher.dispatch(errorRegister); // inside put to ThreadPoolTaskExecutor
pageNum ;
} while (page.hasNext());
}
uj5u.com熱心網友回復:
根據檔案,注釋ThreadPoolTaskScheduler使用的默認值是使用池中的單個執行緒創建的。@Scheduled
假設您沒有自定義該執行緒池,那么您的runRetry方法不可能同時被多個執行緒呼叫。
如果您的runRetry方法不是執行緒安全的,那么無論如何您都應該保護它而不是依賴當前的默認行為。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/384509.html
