1.异步传输文件,解析时报错文件未找到
场景:异步上传excel文件并需要解析时,在执行到代码中使用流时报错文件未找到
原因:因为解析文件的时候并没有存到本地而是作为临时文件在内存中解析,使用异步立即返回的时候,也把临时文件删除了,所以使用流的时候,他找不到流对应路径下的文件
解决:将流接收到后,转byte数组进行传递而不是MultipartFile直接传递,最后在使用流的时候在将byte转换成流
参考代码
InputStream inputStream = file.getInputStream();
byte[] bytes = IOUtils.toByteArray(inputStream);
InputStream inputStream = new ByteArrayInputStream(bytes);
2. 在当前类调用异步方法失效
场景:在系统中使用异步上传excel文件解析数据时,页面上还是一直等待解析完成没有立即收到返回结果
原因:源码中使用异步必须要代理包装对象调用,直接调用方法无法触发代理对象方法调用,必须指明对象来调用方法
解决:
1. 放在另一个类中调用
2. 在本类使用的话 可以用springUtil的getBean方法获取当前类的bean,通过返回的bean来调用异步方法,例:
package cn.hutool.extra.spring;
BatchAdjuApplyService bean = SpringUtil.getBean(BatchAdjuApplyService.class);
3.异步请求导致request-请求头丢失
场景:发送请求到控制层,在控制层调用异步方法时,异步方法获取request为null
原因:因为使用异步时,是另开了个子线程,而request信息是在主线程里面,所以异步线程里面没有请求头信息
解决:
1.最简单的方法将请求头直接拿出来作为参数调用
2.通过配置将请求头带给异步线程
4.@Async异步注解引起数据变化但未来的及持久化到数据库
场景:断点打到异步代码中的插入或修改一条数据(mybatis),发现数据库没有立即发生改变
猜测:可能是没有被持久化或是没有提交事务到数据库层,但是后续代码逻辑不影响因为默认读已提交只是没持久化到数据库,应该是因为异步的执行顺序逻辑
备注:这个问题定义其实有点模糊,当时没有太在意,后面也没遇到类似的
5.正常使用异步注解,但是异步依然失效
场景:在系统审核某笔订单时,页面上一直转圈导致前端页面和网关定义的超时了
原因:因为发现这个项目是第一次使用异步注解,还需要在启动类加上@EnableAsync,但是不加也不会报错,这种问题感觉有点框架上的bug,启动的时候没有检测出来,也没注意启动日志是否有警告日志,如果想确定异步是否生效,可以让异步里面的方法主线程睡几十秒,看有没有等待 如果等待了说明没有生效,没有等待说明异步是正常的
解决:在启动类加上@EnableAsync即可
ps:后续会陆续更新分享开发实际遇到的问题与技术探讨,如果觉得有帮助的,可以点赞收藏支持支持
标签:异步,调用,解析,文件,方法,使用,分享,合集 From: https://blog.csdn.net/wrxfxdd/article/details/140543001