问题描述
在如何使用CompletableFutures进行错误处理中,我完全迷失了它。我需要的是让多个任务运行异步。这些任务包含多个步骤,例如以下示例:
从数据库接收数据->使用此数据进行请求->再次执行请求->更新数据库记录
现在每个步骤都可能导致异常,即找不到数据库记录或数据不正确,请求失败,响应错误或更新数据库失败等。我想处理这些异常以记录错误并停止任务,甚至可以还原任务。
现在,我构建一个新项目以与CompletableFutures一起使用,以模拟此过程。我使用了以下代码:
public static Integer randomError() {
Random rd = new Random();
if(rd.nextBoolean()) {
try {
throw new Exception("RANDOM ERROR");
} catch (Exception e) {
e.printStackTrace();
}
} else {
return rd.nextInt();
}
return 0;
}
ExecutorService ex = Executors.newFixedThreadPool(64);
System.out.println("Main thread: " + Thread.currentThread());
//Starting tasks
List<CompletableFuture> listTasks = new ArrayList<CompletableFuture>();
List<String> listErrors = new ArrayList<String>();
System.out.println("Starting threads...");
for (int i = 0; i < 10; i++) {
int counter = i;
//Add tasks to TaskQueue (taskList)
listTasks.add(
CompletableFuture.supplyAsync(()->{
//Simulate step 1
return 0;
},ex).thenApplyAsync(x -> {
//Simulate step 2
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return x + 1;
},ex).thenApplyAsync(x -> {
//Simulate step 3 with a potential error
randomError();
return x + 1;
},ex).thenApplyAsync(x -> {
//On error this shouldnt be executed?
//Simulate tep 4
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return x + 1;
},ex).thenAcceptAsync( x -> {
//Simulate COMPLETION step 5
// listTasks.remove(counter);
},ex).exceptionally(e -> {
listErrors.add("ERROR: " + counter);
System.out.println(e);
return null;
})
);
}
System.out.println("Done");
现在这段代码创建了10个任务,其中每个任务包含5个步骤。现在,当步骤3产生异常时,步骤4仍将执行。为什么?在我的串行监视器中,我看到了抛出的错误,但是CompletableFuture仍然可以完成。当我做1 / 0;
时。这将产生一个错误,并被.exceptionally()
捕获。如何捕获而不是自定义引发的异常?
我想要的是错误的,停止链接并执行.exceptionally()
来处理错误。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)