1.问题引出
CompletableFuture是异步编程的很好工具,那么对于异步编程,最令人担心的现象就是异常被吞掉了。对应的,同步场景,因为天然是同步等结果,无非就是这么几种情况,返回正常结果,抛出异常,等待超时(设置了超时时间),一直等待(没有设置超时时间),但是对于异步场景来说,无论是监听还是会掉,都有可能因为使用方式的错误导致没有会掉或者没有触发监听,造成的结果就是这次的请求的结果凭空丢失了。
举个最简单的例子:
这是一个CompletableFuture最普通的使用方式,异步执行一个任务,如图所示是一个http请求,拿到结果之后执行complete方法,会触发该future的thenRun方法。但是如果这个http请求抛出了异常会怎么样呢?因为没有catch异常并对异常进行相应的处理,所以这个future永远也不会执行,相当于这个http的结果丢了,回调也不会触发了。
那么正确的做法是什么呢?
这样的话在http请求抛出异常的时候,通过completeExceptionally方法触发了future的回调。这就是一个简单的对于异常的处理,防止异常导致无回调的现象发生。但是本篇文章并不是这么简单的就结束了,而是刚刚开始。因为CompletableFuture提供了很强大的功能,封装了很多方法,这些方法如果使用不当,即使你考虑了异常,可能也不会按照你设想的方式去执行,比如:
这里用thenRun替换掉了上面的whenComplete,那