springMvc使用多线程处理请求,参数中有file时 ,报错找不到临时文件

一、原因,在springMvc处理请求参数中有file时,会将file临时存储到一个位置,等线程结束后,临时文件被删除。

但是如果使用了多线程(异步)处理请求,当这个请求分发到某个线程A后,主线程立即结束并将此临时文件删除,造成了A线程无法读取到这个文件,报出无法找到此文件。

二、解决方法,在下面代码中已经给出,我们在异步处理这个请求时,不要直接把文件传给下一级方法,而是把文件转化为java内存流对象后 ,再把流对象传给异步方法,这样就不会出现因为主线程删除文件导致的文件找不到错误了

 

 //springmvc接收到前端请求,并去调用uploadToSendmail方法
@RequestMapping(value = "/batchPaichong")
    public void batchPaichong(PaichongMenu paichongMenu) throws Exception{
        String to = paichongMenu.getAddr();
        String fileName = paichongMenu.getFile().getOriginalFilename();
        InputStream ips = paichongMenu.getFile().getInputStream();
        lawAnnSecondphaseService.uploadToSendmail(to,fileName,ips);
    }
//  uploadToSendmail方法使用异步处理
 @Async
    public void uploadToSendmail(String to, String fileName,InputStream ips){
        System.out.println("开始发送"+Thread.currentThread().getName());
        if(null!=ips){
            List paiChongList = getObjectFromExcel(fileName,ips);
            XSSFWorkbook workbook = getExcelFromObject(paiChongList);
            sendEmail(workbook,to);
            System.out.println("发送邮件成功"+Thread.currentThread().getName());
        }
    }

 

你可能感兴趣的:(spring)