使用MultipartFile和多线程导致FileNotFoundException
因为有一个上传文件解析的操作很费时,于是同事将其改为异步接口的调用方式。
第一次修改使用了线程池,将耗时操作放到提交到线程池中。第二次修改则是在方法上面加了@Async
注解。
这两种修改方式都会触发这个异常,所以就看了一下。
原因
在Tomcat中每一个用户的请求都会由Tomcat分配一个线程处理,当你使用MultipartFile
时,他会生成一个临时的文件,这个文件实际上是保存在Tomcat给你分配的这个线程里面。如果你使用了异步的方式,并且在异步代码块中操作MultipartFile
,这个时候因为主线程的完成,Tomcat回收该用户线程和相关资源,就会导致出现 FileNotFoundException
。
解决方法
提前将文件解析完成后,调用异步时,传入处理完成的数据,并关闭文件流
提前获取
InputStream
,但是这个会出现一个问题,就是tomcat回收的时候可能不会回收掉这部分内存,导致临时文件越来越多。