任务链中的CompletableFuture错误处理

问题描述

在如何使用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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...