如何在传播结果或错误时调用CompletableFuture回调



我正在尝试。exception和。handle,但这些似乎不起作用。在scala中,你可以用一个闭包在未来调用一个方法,就像一个finally块(它在异常和成功时运行),并且它按现状向链上传播异常或成功。

I tried this…

    CompletableFuture<Object> future = newFuture.handle((r, e) -> {
        if(r != null)
            return r;
        else if(e != null)
            return e;
        else
            return new RuntimeException("Asdf");            
    });
    Assert.assertTrue(future.isCompletedExceptionally());

但是这个测试失败了,因为未来完全成功了,结果是异常(多么奇怪)

使用CompletableFuture#whenComplete(BiConsumer)。它的javadoc状态

返回一个新的CompletionStage ,结果或异常与此阶段,在此阶段完成时执行给定的操作。

当此阶段完成时,使用结果(如果没有则为null)和异常(如果没有则为null)舞台作为论据。返回阶段完成时,动作的回报。如果提供的操作本身遇到异常,则返回的阶段异常完成,除非此阶段也异常完成。

换句话说,无论成功还是失败,它都将被调用,并且将传播初始future的状态(除非BiConsumer抛出异常)。

CompletableFuture<String> future2 = newFuture.whenComplete((r, e) -> {
    // consume the result
});

如果您需要转换结果(在您的示例中,您不需要),那么您可以使用handle并自己传播内容。

哦,我想我明白了....像这样的东西似乎可以工作

    CompletableFuture<Integer> future2 = newFuture.handle((r, e) -> {
        //put finally like logic right here....
        if(r != null)
            return r;
        else if(e != null)
            throw new RuntimeException(e);
        else
            throw new RuntimeException("weird");
    });

最新更新