我正在处理一些涉及按顺序执行多个阻塞I / O操作的代码。上下文是在Java 8和Tomcat上运行的基于JVM的Web应用程序。我有代码按顺序执行三个操作。所有都具有阻塞性质,并且每个操作的输出可以在后续操作中使用。每个操作都可以抛出异常,无论是选中还是未选中。我已经说明了一些可以引发的示例异常:
String output1 = callToRestAPI(); // throws MalformedUrlException, ConcurrentModificationException
callToDatabase(output1); // throws SQLException, ConcurrentModificationException
boolean output2 = callToSendEmail(output1); // throws MessagingException
我如何使用Java 8的承诺(没有双关语)CompletionStage和CompletableFuture来编写这个?
答案 0 :(得分:4)
希望这会有所帮助。
import java.util.concurrent.CompletableFuture;
public class HandleException {
public static void main(String[] args) {
CompletableFuture.completedFuture(null)
.thenApply(__ -> callToRestAPI())
.thenApply(
output1 -> {
callToDatabase(output1);
return output1;
})
.thenAccept(output1 -> callToSendEmail(output1))
.exceptionally(
t -> {
System.out.println("Exception occurred: " + t.getMessage());
return null;
});
}
}
当代码被阻塞时,使用thenApply和thenAccept。当我们想返回下一个thenXXX方法时使用thenApply。 thenAccept不返回任何内容。 您还可以使用runAsync或supplyAsync将callToRestAPI,callToDatabase设置为Async(非阻塞代码)