簡體   English   中英

如何使用 Spring 延遲計划任務?

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

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