[英]How to delay a scheduled task with Spring?
我想創建一個方法,將方法調用的執行延遲 60 秒。
問題:如果在 60 秒內調用該方法,我希望它從調用的最后一個點再次延遲 60 秒。 如果在 60 秒內未調用,則可以繼續執行。
我是這樣開始的,但是當然這只是一次延遲:
public void sendDelayed(String info) {
//TODO create a task is delayed by +60s for each method invocation
ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
executorService.schedule(Classname::someTask, 60, TimeUnit.SECONDS);
}
我怎樣才能進一步延遲每次調用的執行?
executorService.schedule
返回一個ScheduledFuture
,它提供了一個cancel
方法來取消其執行。 cancel
采用單個 boolean 參數mayInterruptIfRunning
,當設置為false
時,僅當任務尚未開始時才會取消執行。 另請參閱文檔。
使用它你可以做這樣的事情:
private ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
private ScheduledFuture<?> future;
public void sendDelayed(String info) {
// When there is a task that has not been started yet, stop it:
if (future != null) {
boolean cancelled = future.cancel(false);
if (cancelled) {
logger.debug("Task has been cancelled before execution");
} else {
logger.debug("Task is already running or has been completed");
}
}
// Old task has been cancelled or already started - schedule a new task
future = executorService.schedule(Classname::someTask, 60, TimeUnit.SECONDS);
}
不過,您可能必須注意避免有關對future
字段的並發訪問的競爭條件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.