我是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的任一对象。
如何才能打破这个加工链条?我知道我可以向链中的每个函数传递一个标志,并通过根据标志的值执行函数中的操作来实现这一点。我希望有更好的办法。
谢谢!!
我会重写你的代码。
来自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完成后执行。 此方法的调用者还添加了另一个块,其中包含