「扫码关注我,面试、各种技术(mysql、zookeeper、微服务、redis、jvm)持续更新中~」
接到一个退费回调的需求,当三方回调通知支付平台支付成功时,需要将退费成功结果异步通知到调用方(APP),如果通知失败,需要进行4次重试,采用Http方式通知调用方接口即可。重点已经标出~
那么接下来就是技术选型了,首先异步怎么处理,立马想到了MQ啊,异步解耦,但是感觉有点杀鸡焉用宰牛刀的感觉,最终还是决定用JDK8升级java.util.concurrent包下Future的完善版CompletableFuture来解决异步的问题。JDK8为什么要升级Future呢?主要是是因为:1.Future虽然可以实现获取异步执行结果的需求,但是它没有提供通知的机制,我们无法得知Future什么时候完成;2.要么使用阻塞,在future.get()的地方等待future返回的结果,这时又变成同步操作。要么使用isDone()轮询地判断Future是否完成,这样会耗费CPU的资源。CompletableFuture弥补了Future模式的缺点。在异步的任务完成后,需要用其结果继续操作时,无需等待。可以直接通过thenAccept、thenApply、thenCompose等方式将前面异步处理的结果交给另外一个异步事件处理线程来处理。