我需要某种任务调度程序,它将安排任务的执行(一次)并监视任务是否仍然“活着”,因此如果发生某些未捕获的异常(如IOexception或数据库连接失败) - 调度程序将从头开始重新启动任务。
我不想在while(true)循环中捕获Throwable,只是想让它失败。
理想情况下,应该创建新的线程。
有什么东西可以直接使用吗?它很容易用ThreadFactory实现这种调度程序,仍然不确定我是否应该重新发明轮子。
答案 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,您可以处理它并重新安排