Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 异常后持续存在的任务的ScheduledExecutorService_Java_Task_Scheduling_Scheduledexecutorservice - Fatal编程技术网

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。