现象:使用了allof().get()去阻塞线程等待子线程跑完,但子线程还是没跑完就结束了。
代码如图:
如果您熟悉CompletableFuture的.allOf方法应该知道题主是想等3个异步任务完成再往下执行,但事实是3个异步任务执行到最后 "好像" 都没执行,比如cf.get()的值是null,其他任务做的赋值都是null,导致页面都显示无数据,事实上不用异步编排是有数据的,百思不得其解!
去技术交流群问了一下,得到以下结果,哭笑不得
事实上,题主的代码没有问题,真正问题出在 多数据源
思路描述:
因为项目中用到了多个数据库,有mysql有Oracle,项目的多数据源是配置在controller层上的,这样最省力,里面的方法都不用每个都配@DS巴拉巴拉的;但是如果你使用了CompletableFuture多线程,不好意思你的子线程用的数据源不是和主线程保持一致,这就导致了子线程用的是多数据源默认的连接配置,我刚好是因为两个数据库都有同样的表mysql没数据所以一直返回null 误以为是子线程没跑完主线程就结束了。
补充:如果有mybatisPlus提示这个错,也是CompletableFuture和多数据源导致的,debug看到id明明是18位sql报错提示语法错误
nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use ne...
解决方案:
在每个子线程调用的方法上指定数据源即可。