Java 异常后持续存在的任务的ScheduledExecutorService
Java 异常后持续存在的任务的ScheduledExecutorService,java,task,scheduling,scheduledexecutorservice,Java,Task,Scheduling,Scheduledexecutorservice,Java的scheduleAtFixedRate()和scheduleWithFixedDelay()方法的文档说明,对于任何计划任务,“如果任务的任何执行遇到异常,后续执行将被抑制。” 有没有办法使这两种方法具有相同的功能,但即使在任务中出现异常(手动抑制该异常除外)后仍能保持不变?不仅可以使用这些方法,还可以很容易地创建自己的计划执行器,从而有效地避开该行为。我没有试着编译这个,但是作为第一次尝试 public final类KeepOnChuggingExecutor实现ScheduledE
Java
的scheduleAtFixedRate()
和scheduleWithFixedDelay()
方法的文档说明,对于任何计划任务,“如果任务的任何执行遇到异常,后续执行将被抑制。”
有没有办法使这两种方法具有相同的功能,但即使在任务中出现异常(手动抑制该异常除外)后仍能保持不变?不仅可以使用这些方法,还可以很容易地创建自己的计划执行器,从而有效地避开该行为。我没有试着编译这个,但是作为第一次尝试
public final类KeepOnChuggingExecutor实现ScheduledExecutorService{
专用最终ScheduledExecutorService ScheduledExecutorService;
公共KeepOnChuggingExecutor(ScheduledExecutorService ScheduledExecutorService){
this.scheduledExecutorService=scheduledExecutorService;
}
//处理任务中的任何异常
私有可运行可运行(可运行可运行){
返回()->{
试一试{
runnable.run();
}
捕获(例外e){
//如果你想,就把它记录下来
}
};
}
私有可调用wrapCallable(可调用){
返回()->{
试一试{
返回callable.call();
}
捕获(例外e){
//如果你想,就把它记录下来
}
};
}
//然后,对于调度执行器上的每个接口方法,包装
//给定任务,以避免出现异常。
@凌驾
公共计划未来计划(可运行命令,长延迟,时间单位){
返回此.scheduledExecutorService.schedule(
这个.wraprunable(命令),
延迟
单元
);
}
@凌驾
公共计划未来计划(可调用、长延迟、时间单位){
返回此.scheduledExecutorService.schedule(
此.wrapCallable(可调用),
延迟
单元
);
}
//依此类推所有已调度的方法。然后在
//Executor您可以委托给这个类包装的服务。
// ...
@凌驾
公共布尔值已取消(){
返回此.scheduledExecutorService.isTerminated();
}
// ...
}
所以这里的一般解决方案是“组合”模式。这是冗长的,你确实重复了你自己,但你们都不能将一个任意的遗嘱执行人分类以避免重复,并且可能不想重复(以免你落入所有那些看着遗产哭泣的人的命运中)
您仍然需要抑制异常,但将该工作从任务定义中移开会有一些好处。为什么必须使用这两种方法?它们已经在代码中使用过,无法轻易更改。再说,为什么不呢?它们没有被弃用。如果你有其他的建议,请更具体一些。因为你有一个问题,一旦一次执行失败,其他一切都会发生。这是spring应用程序吗?不是,只是本机Java。