相同的代码,同步上传文件没问题,异步上传时, MultipartFile.transferTo(dest); 写入文件的时候偶尔会报No such file or directory
猜测是在响应结束之后,主线程被清理,file的内存区域被清除回收了,和servlet规范一致,导致异步线程中读取不到请求发送过来的文件。
下面进行验证:请求进来时,获取文件大小,此时size = 162086 byte
刚进入异步线程时,此时文件还是存在的
线程休眠几秒,发现此时文件已被清理,这才导致后面读取文件时找不到文件信息。
由此可见上面的猜想应该是对的, file参数对象就像servlet的request和response对象一样,请求一结束就被清理了。
想要避免这种情况,可以在发起异步前将文件暂存到本地,后面直接在暂存目录中操作文件,但这样又会延长响应时长,异步的意义就并不明显了。这里由于我需要将文件上传到eap, 所以即使我将文件暂存到本地,也要省去等待上传eap的时间,总体上响应时间还是能减少一半左右。
具体要如何规避这个问题,还需结合业务场景选择适当的实现方案。



