强大的任务调度程序,在失败时重启任务

时间:2013-05-24 02:08:19

标签: java concurrency scheduler

我需要某种任务调度程序,它将安排任务的执行(一次)并监视任务是否仍然“活着”,因此如果发生某些未捕获的异常(如IOexception或数据库连接失败) - 调度程序将从头开始重新启动任务。

我不想在while(true)循环中捕获Throwable,只是想让它失败。

理想情况下,应该创建新的线程。

有什么东西可以直接使用吗?它很容易用ThreadFactory实现这种调度程序,仍然不确定我是否应该重新发明轮子。

2 个答案:

答案 0 :(得分:1)

Quartz是一个非常好的调度程序; here is some retry-on-failure code

答案 1 :(得分:0)

试试这个

    Runnable task = new Runnable() {
        @Override
        public void run() {
            throw new RuntimeException();
        }
    };
    for (;;) {
        ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor();
        ScheduledFuture<?> f = ex.schedule(task, 1000, TimeUnit.MILLISECONDS);
        try {
            f.get();
            break;
        } catch (InterruptedException e) {
            f.cancel(true); 
            break;
        } catch (ExecutionException e) {
            // process exception
        } finally {
            ex.shutdown();
        }
    }

如果在任务执行期间发生异常,f.get()会抛出ExecutionException,您可以处理它并重新安排