2013-02-28 58 views
1

我正在使用Spring的TaskScheduler安排周期性任务。根据任务的结果取消预定的固定费率任务

ScheduledFuture scheduleAtFixedRate(Runnable task, long period); 

我知道我可以调用ScheduledFuture上的cancel()来停止执行循环任务。但是我想取消定期执行的任务,具体取决于任务的执行结果,我不知道如何做到最好。

ScheduledFuture是否允许我访问每个执行任务的结果?或者,我是否需要某种可以保留对此ScheduledFuture的引用的任务侦听器,并以这种方式取消它?或者是其他东西?

+1

仅供参考,这是使用'ScheduledExecutorService'可能实现。所以你可能想扩大这个问题,因为它没有明确依赖于spring。 – 2013-02-28 03:09:34

回答

0

好吧,它看起来可能,但可能有更好的方法。

由于重复作业只需要Runnable(具有void返回类型),因此无法返回任务结果。因此,停止重复任务的唯一方法是让任务执行副作用,例如,将停止消息添加到队列。然后,一个单独的线程需要监视这个队列,并且一旦它看到该消息就可以取消该作业。

非常混乱和复杂。

更好的选择是创建一个正常的(一次)计划任务。任务本身可以决定是否需要调度另一个任务,并且可以执行下一个任务本身的调度。

0

保留一个句柄或原始固定费用ScheduledFuture,然后当条件出现在你想取消它的地方时,安排一个新的取消任务。

您可能也可以用RunnableScheduledFuture做些事情。

ScheduledExecutorService文档

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html

import static java.util.concurrent.TimeUnit.*; 
class BeeperControl { 
    private final ScheduledExecutorService scheduler = 
    Executors.newScheduledThreadPool(1); 

    public void beepForAnHour() { 
    final Runnable beeper = new Runnable() { 
     public void run() { System.out.println("beep"); } 
    }; 
    final ScheduledFuture<?> beeperHandle = 
     scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS); 
    scheduler.schedule(new Runnable() { 
     public void run() { beeperHandle.cancel(true); } 
    }, 60 * 60, SECONDS); 
    } 
}