记一次多线程异步调取Feign接口失败问题及其解决
在一次线上环境中反馈短信和消息没有发出去,我赶紧排查问题,前面说下我的业务场景:发短信和发消息都是使用多线程异步执行,通过调取Feign来调取push服务的推送接口来进行推送,因为要快速反馈给用户消息,正好前一段时间学会用CompletableFuture,正想小试牛刀的我,依然决然采用之来实现异步推送,本来用起来还蛮好的,简单易懂方便,而且支持线程窃取等一系列功能,简直是如获至宝,但是今天线上突然出现了以下错误,泼了我一脸冷水:
Task java.util.concurrent.FutureTask@68bb4099 rejected from java.util.concurrent.ThreadPoolExecutor@f8b8538[Running, pool size = 10, active threads = 10, queued tasks = 20, completed tasks = 693]
开始一度以为是CompletableFuture的锅,但是经过我百度了会,发现其实我错怪了CompleteFuture了,一开始还去看CompleteFuture的源码,了解到CompletableFuture用的是ForkJoinPool的线程池,默认线程数是系统机的cpu核心数,但这个错误为啥报的是active threads=10,这个我就郁闷了,而且CompletableFuture默认会给每个工作线程分配独立的队列,应该不会出现并发调直接拒绝我的任务的问题啊!思前想后我还是想不通,后来索性把堆栈打出来了,我这才知道是Hystrix的问题:
java.util.