我刚刚开始熟悉 Java 的 CompletableFuture 工具。我创建了一个小玩具应用程序来模拟几乎所有开发人员都会遇到的一些经常性用例。
在这个例子中,我只想将一个东西保存在数据库中,但在这样做之前我想检查该东西是否已经保存。
如果该事物已经在数据库中,则流程(可完成的未来链)应该停止并且不保存该事物。我正在做的是抛出一个异常,这样最终我就可以处理它并向服务的客户端提供一个好的消息,以便他知道发生了什么。
这是我到目前为止所尝试过的:
首先是尝试保存事物的代码,如果事物已在表中,则抛出错误:
repository
.query(thing.getId())
.thenCompose(
mayBeThing -> {
if (mayBeThing.isDefined()) throw new CompletionException(new ThingAlreadyExists());
else return repository.insert(new ThingDTO(thing.getId(), thing.getName()));
Run Code Online (Sandbox Code Playgroud)
这是我正在尝试运行的测试:
CompletableFuture<Integer> eventuallyMayBeThing =
service.save(thing).thenCompose(i -> service.save(thing));
try {
eventuallyMayBeThing.get();
} catch (CompletionException ce) {
System.out.println("Completion exception " + ce.getMessage());
try {
throw ce.getCause();
} catch (ThingAlreadyExist tae) {
assert (true);
} catch (Throwable t) {
throw new AssertionError(t);
}
}
Run Code Online (Sandbox Code Playgroud)
我从这个响应中采用了这种方式:从 CompletableFuture 抛出异常(投票最多的答案的第一部分)。
然而,这是行不通的。确实被抛出ThingAlreadyExist,但它从未被我的 try catch 块处理。我的意思是,这个:
catch (CompletionException …Run Code Online (Sandbox Code Playgroud)