记一次使用Java8新特性中的parallelStream⭐️数据流引发的接口异常以及解决方法

目录

前言       

正文

代码

分析

问题解决

总结


前言       

        小伙伴们大家好,分享下开发过程中最近遇到的坑,根据新需求,项目的一处模块需要改动,大致说下该模块的流程。。。好像之前有讲过,翻翻看,果然

        是同一个接口,查看这里即可

正文

        简单叙述下这次的故障,接口方法逻辑第一步就是切库,然后去查询相应的数据拼装承集合返回即可,需要做的就是在查询数据时,从另外一个data_point表中查询数据的创建时间,嗯基槽,搞个mapper传一些参数查询出来拼到结果集里就行,三下五除二改好用apipost测试下

        No 接口异常了,哼哼 不慌,打开控制台看看什么问题(滚轮疯狂滑动),显示执行sql时主库里没有该表(废话,有表还切库干嘛)等等我不是切库了吗,继续往上翻,没发现切库异常报错呀,莫慌打个断点调试下,纳尼 切库确实没问题啊,怎么新增的mapper这里就窜到主库里去了

        two thousand year later...各种方法都试过了(去除缓存,另起一个mapper,chatGpt...)最后找大佬同事帮哈忙瞅了瞅,找到问题了,大家伙看标题应该就知道了,没错异步stream流的问题,来看下事发代码

代码

visitDateForSubjectList.parallelStream()
//                .filter(visitData -> !this.checkTaskIsOutGroup(visitData, settings))
                .forEach(visitData -> blockList.stream().filter(e -> e.getIInsId().equals(visitData.getInstanceId())).forEach(block -> {
                    setBlockRelatedDate(block, dataPointList, dataPageList);
                    subjectTaskVOList.add(this.setSubjectTaskRelatedDate(timeMap, subjectId, visitData, block, forms, settings));
                }));

分析

        这里调用了新特性数据流,然后在这里新建一个线程异步去拼接一部分数据,巧了,新增的代码正好让我给加到这里的this调用的方法中了,但是新建的线程并不会走控制层的切库方法,导致直接到主库里查询,然后报错

Java中的parallelStream是Java 8引入的一个功能,它允许以并行方式处理数据流。当使用parallelStream时,数据处理会分布到多个线程上,这些线程通常是从ForkJoinPool中获取的,默认情况下其线程数目取决于运行时机器的CPU核心数目。

问题解决

        发现问题后面就容易了,异步调用中不能切库(测试过有问题)是吧,那就直接在对需要进行数据流处理的集合抢先一步操作, 代码如下,先一步处理需要改动的数据,流厘米按需要赋值的时候直接从map中取即可,改造完成,跑一下没有异常 OVER.

记一次使用Java8新特性中的parallelStream⭐️数据流引发的接口异常以及解决方法_第1张图片

总结

        大胆怀疑,这里因为是对原有的代码改造,导致太过于信赖原生代码,一直在检查自己代码,迷失了方向,所以说小伙伴们要大胆质疑,勇于实践!


你可能感兴趣的:(开发日志,java)