当前位置: 首页 > 知识库问答 >
问题:

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

鲁博赡
2023-03-14

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

java prettyprint-override">public CompletionStage<Either<ErrorResponse, Response>> insertOrUpdate(String actor, String key) {
    return this.objectDAO.getByKey(key)
            .thenApply(mapDOToContainer(key))
            .thenApply(mergeContainerToDO(key, actor))
            .thenComposeAsync(this.objectDAO.UpdateFn())
            .thenApply(DBResult::finished)
            .thenApply(finished -> {
                if (finished) {
                    Response response = Response.ok().build();
                    return Either.right(response);
                } else {
                    return Either.left(ErrorResponse.create("Error", 400));
                }
            });
}

现在我需要修改它,这样,如果get失败,我就执行上面的链,但是如果成功,我就需要打破这个链,从函数返回一个包含ErrorResponse的任一对象。

如何才能打破这个加工链条?我知道我可以向链中的每个函数传递一个标志,并通过根据标志的值执行函数中的操作来实现这一点。我希望有更好的办法。

谢谢!!

共有1个答案

壤驷深
2023-03-14

我会重写你的代码。

  • 对于错误都不要使用,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));
}

DAO应该是这样的:

class ObjectDAO {
    public Object getByKey(String key) {
        if (keyNotFound) {
            throw new NoSuchElementException();
        }

        return new Object();
    }
}

您可能必须确保ErrorResponse是Response的子类才能使其工作。

 类似资料:
  • 问题内容: 我知道设计不能通过中断来控制其执行,但是我想其中有些人可能会遇到此问题。s是组成异步执行的一种非常好的方法,但是考虑到当您希望取消future时中断或停止基础执行时,我们该怎么做?还是我们必须接受,任何取消或手动完成的操作都不会影响正在执行该操作的线程? 我认为,那显然是一项无用的工作,需要花费执行者的时间。我想知道在这种情况下哪种方法或设计可能会有所帮助? 更新 这是一个简单的测试

  • 我有一些工作流抽象依赖于接口: 现在我有三个不同的类来实现这个接口: 我得到一个错误,编译器不能推断函数接口类型。我的问题是:如何实现以下调用链: 当所有实例化的对象实现相同的接口时?

  • 我预计从下面的代码中,由于超时,可转换的未来将停止处理。但我可以看到取消没有任何影响。 我可以看到2个完全期货仍在运行。

  • #include <stdio.h> #include <stdlib.h> void drawing (int n) { if (n != 0) puts ("Try again?\nAll you need is a dollar, and a dream."); else puts ("You win $3000!"); } int main (void) {

  • 该程序的输出: 是: 为什么当 开始时 不是 1?

  • 所以我有一个方法,返回一个完整的未来。在返回之前,该方法添加了一个带有accept的块,该块在CompletableFuture完成后执行。 此方法的调用者还添加了另一个块,其中包含