具有非void返回值的方法的javaspring异步异常处理

dojqjjoe  于 2021-07-07  发布在  Java
关注(0)|答案(2)|浏览(401)

我有一个执行特定任务的异步函数,下面是示例代码,

@Async
    public CompletableFuture<Boolean> foo(String value) throws Exception {
        // do task
        LOGGER.info("Processing completed");
        return CompletableFuture.completedFuture(true);
    }

无论何时发生任何运行时异常,都不会通知调用者函数,并且应用程序运行时不会出现任何错误/异常。这是危险的,因为我们会错误地假设处理是成功的。
如何避免这种情况,并使方法在任何异常发生时报告错误?

nnt7mjpx

nnt7mjpx1#

您可以使用executely方法在调用方处理异常 CompletableFuture ```
CompletableFuture foo = service.foo(value)
.exceptionally(ex-> /* some action */ false);

hmae6n7t

hmae6n7t2#

为了克服这个问题,您需要添加一个异常try/catch块,并在可完成的future示例中设置异常

@Async
    public CompletableFuture<Boolean> foo(String value) {
        CompletableFuture completableFuture = new CompletableFuture();
        try{
            // do task
            LOGGER.info("Processing completed");
            completableFuture.complete(true);
        } catch(Exception e) {
            completableFuture.completeExceptionally(e);
        }
        return completableFuture;
    }

在来电端,

CompletableFuture<Boolean> foo = service.foo(value);
        foo.whenComplete((res, ex) -> {
            if (ex == null) {
                // success flow ...
            } else {
                // handle exception ...
                ex.printStackTrace();
                LOGGER.error("ERROR ----> " + ex.getMessage());
            }
        });

相关问题