Java-使用CompletableFuture链中断执行序列

Java-使用CompletableFuture链中断执行序列,java,Java,我是Java新手,正在使用CompletableFutures执行异步操作,如下所示: public CompletionStage insertOrUpdate(字符串参与者,字符串键){ 返回这个.objectDAO.getByKey(key) 。然后应用(mapDOToContainer(键)) .然后应用(合并容器TODO(键,参与者)) .ThencomposeSync(this.objectDAO.UpdateFn()) .thenApply(DBResult::finished)

我是Java新手,正在使用CompletableFutures执行异步操作,如下所示:

public CompletionStage insertOrUpdate(字符串参与者,字符串键){
返回这个.objectDAO.getByKey(key)
。然后应用(mapDOToContainer(键))
.然后应用(合并容器TODO(键,参与者))
.ThencomposeSync(this.objectDAO.UpdateFn())
.thenApply(DBResult::finished)
。然后应用(完成->{
如果(完成){
Response=Response.ok().build();
返回其中一个。对(响应);
}否则{
返回.left(ErrorResponse.create(“Error”,400));
}
});
}
现在我需要修改它,如果get失败,那么我执行上面的链,但是如果它成功,那么我需要断开这个链,从函数返回一个包含ErrorResponse的对象

我如何打破这个处理链?我知道我可以向链中的每个函数传递一个标志,并根据标志的值执行函数中的操作来实现这一点。我希望有更好的方法来做到这一点


谢谢

我会重写你的代码

  • 这两种方法都不能用于错误,Java有异常
  • 不要从DAO返回CompletionStage
  • 使用CompletableFuture中的
    例外
    ,它是为此而设计的
然后这样做:

public CompletionStage<Response> insertOrUpdate(String actor, String key) {
    return CompletableFuture.supplyAsync(() -> this.objectDAO.getByKey(key))
            .thenApply(mapDOToContainer(key))
            .thenApply(mergeContainerToDO(key, actor))
            .thenComposeAsync(this.objectDAO.UpdateFn())
            .thenApply(DBResult::finished)
            .thenApply(finished -> {
                Response response = Response.ok().build();
                return response;
            })
            .exceptionally(e -> ErrorResponse.create("Error", 400));
}

您可能必须确保ErrorResponse是Response的一个子类,才能使其正常工作。

我将重写您的代码

  • 这两种方法都不能用于错误,Java有异常
  • 不要从DAO返回CompletionStage
  • 使用CompletableFuture中的
    例外
    ,它是为此而设计的
然后这样做:

public CompletionStage<Response> insertOrUpdate(String actor, String key) {
    return CompletableFuture.supplyAsync(() -> this.objectDAO.getByKey(key))
            .thenApply(mapDOToContainer(key))
            .thenApply(mergeContainerToDO(key, actor))
            .thenComposeAsync(this.objectDAO.UpdateFn())
            .thenApply(DBResult::finished)
            .thenApply(finished -> {
                Response response = Response.ok().build();
                return response;
            })
            .exceptionally(e -> ErrorResponse.create("Error", 400));
}

您可能必须确保ErrorResponse是Response的一个子类,才能使其正常工作。

异常将断开此链。CompletableFuture有特殊的方法来处理异常情况,我也不会使用
返回错误,这是针对没有异常的语言。您可以应用like
可选的.of(objectDAO.getByKey(key))
。或者DAO的方法可以返回一个可选的,因为显然有一个选项,这个DAO找不到键。关键是:在这里很有用。一个例外会打破链条。CompletableFuture有特殊的方法来处理异常情况,我也不会使用
返回错误,这是针对没有异常的语言。您可以应用like
可选的.of(objectDAO.getByKey(key))
。或者DAO的方法可以返回一个可选的,因为显然有一个选项,这个DAO找不到键。重点是:在这里很方便。谢谢!我对“异常”的用法有点困惑,但这就清楚了。谢谢!我对“例外”的用法有点困惑,但这就清楚了。