一、原因,在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<ExcelPaichong> paiChongList = getObjectFromExcel(fileName,ips);
XSSFWorkbook workbook = getExcelFromObject(paiChongList);
sendEmail(workbook,to);
System.out.println("發送郵件成功"+Thread.currentThread().getName());
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/258140.html
標籤:其他
下一篇:go預防跨站腳本
