後臺處理請求時間過長導致頁面超時
阿新 • • 發佈:2019-01-05
專案中有個從頁面發起的AJAX請求後臺需要處理十分鐘以上,這導致頁面超時卡死,
為了解決這個問題,經討論,我們採用後臺非同步處理,用到了spring的@Async,用法很簡單。
首先在spring的xml配置檔案中新增如下配置:
xmlns:task="http://www.springframework.org/schema/task" http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd"> <task:annotation-driven />
其次在需要非同步執行的方法上新增@Async註解即可:
package async; import java.util.HashMap; import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class MyController { @Resource MyService myService; @RequestMapping("/testAsync.do") @ResponseBody public Map<String, Object> testAsync(HttpServletRequest req){ Map<String, Object> resultMap = new HashMap<String, Object>(); String param = req.getParameter("param"); //呼叫非同步執行的方法 myService.excuteAsync(param); resultMap.put("resultMsg", "非同步處理中..."); return resultMap; } }
package async;
import org.springframework.scheduling.annotation.Async;
public class MyService {
//需要非同步處理的業務方法
@Async
public void excuteAsync(String param){
// do something;
}
}
頁面超時的問題解決了,但是非同步方法什麼時候執行完,
操作人員如果想知道進度或第一時間知道執行結果怎麼辦呢?
目前想到了三種解決方法:
一、非同步方法執行完後,傳送郵件給操作人;
二、實時查詢後臺執行的進度顯示在頁面;
三、非同步方法執行完後,再在頁面給一個提示。
我們採用的是第一種,至於每一種的具體實現,這裡就不詳述了。
流程圖: