如何使用CompletableFuture和CompletionStage进行异常处理

时间:2018-05-17 01:58:15

标签: java asynchronous java-8 completable-future

我正在处理一些涉及按顺序执行多个阻塞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来编写这个?

1 个答案:

答案 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(非阻塞代码)