使用MultipartFile和多线程导致FileNotFoundException

因为有一个上传文件解析的操作很费时,于是同事将其改为异步接口的调用方式。

第一次修改使用了线程池,将耗时操作放到提交到线程池中。第二次修改则是在方法上面加了@Async注解。

这两种修改方式都会触发这个异常,所以就看了一下。

原因

在Tomcat中每一个用户的请求都会由Tomcat分配一个线程处理,当你使用MultipartFile 时,他会生成一个临时的文件,这个文件实际上是保存在Tomcat给你分配的这个线程里面。如果你使用了异步的方式,并且在异步代码块中操作MultipartFile ,这个时候因为主线程的完成,Tomcat回收该用户线程和相关资源,就会导致出现 FileNotFoundException

解决方法

  1. 提前将文件解析完成后,调用异步时,传入处理完成的数据,并关闭文件流

  2. 提前获取InputStream ,但是这个会出现一个问题,就是tomcat回收的时候可能不会回收掉这部分内存,导致临时文件越来越多。