Java 故障时重新启动任务的健壮任务调度器

Java 故障时重新启动任务的健壮任务调度器,java,concurrency,scheduler,Java,Concurrency,Scheduler,我需要某种类型的任务调度器,它将调度任务的执行(一次),并监视任务是否仍然处于“活动”状态,因此如果发生一些未捕获的异常(如IOexception或数据库连接失败),调度器将从头开始重新启动任务 我不想在while(true)循环中抓住Throwable,只想让它失败 理想情况下,应该创建新线程 有现成的吗?用ThreadFactory实现这种调度器很简单,但仍然不确定是否应该重新发明控制盘。试试这个 Runnable task = new Runnable() { @O

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

我不想在while(true)循环中抓住Throwable,只想让它失败

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

有现成的吗?用ThreadFactory实现这种调度器很简单,但仍然不确定是否应该重新发明控制盘。

试试这个

    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();
        }
    }
Runnable任务=新建Runnable(){
@凌驾
公开募捐{
抛出新的RuntimeException();
}
};
对于(;;){
ScheduledExecutorService ex=执行者。newSingleThreadScheduledExecutor();
ScheduledFuture f=ex.schedule(任务,1000,时间单位为毫秒);
试一试{
f、 get();
打破
}捕捉(中断异常e){
f、 取消(真);
打破
}捕获(执行例外){
//进程异常
}最后{
例如关闭();
}
}
如果在任务执行期间发生异常,f.get()会抛出ExecutionException,您可以对其进行处理并重新调度

    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();
        }
    }
Runnable任务=新建Runnable(){
@凌驾
公开募捐{
抛出新的RuntimeException();
}
};
对于(;;){
ScheduledExecutorService ex=执行者。newSingleThreadScheduledExecutor();
ScheduledFuture f=ex.schedule(任务,1000,时间单位为毫秒);
试一试{
f、 get();
打破
}捕捉(中断异常e){
f、 取消(真);
打破
}捕获(执行例外){
//进程异常
}最后{
例如关闭();
}
}

如果在任务执行过程中发生异常,f.get()抛出ExecutionException,您可以对其进行处理并重新调度

是一个非常好的调度器

是一个非常好的调度器

我只需要安排一次任务,在一些固定的延迟之后。我只需要安排一次任务,在一些固定的延迟之后。嗯,对于那个简单的任务来说太重了。这就像在单页网站上使用Spring MVC一样。同意-我不确定这是否是您唯一的调度任务,或者您是否有额外的工作需要使用完整的调度程序,对于那个简单的任务来说,这太重了。这就像在单页网站上使用SpringMVC一样。同意-我不确定这是否是您唯一的调度任务,或者您是否有额外的工作需要使用完整的调度程序