1. 程式人生 > >後臺處理請求時間過長導致頁面超時

後臺處理請求時間過長導致頁面超時

專案中有個從頁面發起的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;
	}
	
}

頁面超時的問題解決了,但是非同步方法什麼時候執行完,

操作人員如果想知道進度或第一時間知道執行結果怎麼辦呢?

目前想到了三種解決方法:

一、非同步方法執行完後,傳送郵件給操作人;

二、實時查詢後臺執行的進度顯示在頁面;

三、非同步方法執行完後,再在頁面給一個提示。

我們採用的是第一種,至於每一種的具體實現,這裡就不詳述了。

流程圖: