我無法爲用戶建立AsyncContext並使用它們向他們推送通知。在頁面加載我有一些jQuery代碼來發送請求:Servlet 3.0:無法發送異步響應?
$.post("TestServlet",{
action: "registerAsynchronousContext"
},function(data, textStatus, jqXHR){
alert("Server received async request"); //Placed here for debugging
}, "json");
而在「的TestServlet」我有這樣的代碼在doPost方法:
HttpSession userSession = request.getSession();
String userIDString = userSession.getAttribute("id").toString();
String paramAction = request.getParameter("action");
if(paramAction.equals("registerAsynchronousContext"))
{
AsyncContext userAsyncContext = request.startAsync();
HashMap<String, AsyncContext> userAsynchronousContextHashMap = (HashMap<String, AsyncContext>)getServletContext().getAttribute("userAsynchronousContextHashMap");
userAsynchronousContextHashMap.put(userIDString, userAsyncContext);
getServletContext().setAttribute("userAsynchronousContextHashMap", userAsynchronousContextHashMap);
System.out.println("Put asynchronous request in global map");
}
//userAsynchronousContextHashMap is created by a ContextListener on the start of the web-app
然而,根據Opera蜻蜓(調試像Firebug這樣的工具),看起來服務器在發送請求後發送大約30000ms的HTTP 500響應。
任何使用userAsyncContext.getResponse()。getWriter()。print(SOME_JSON)創建並在HTTP 500響應未被瀏覽器接收之前發送的響應,我不知道爲什麼。僅當處理AsyncContext的「if」語句中的所有代碼都不存在時,瀏覽器纔會收到使用常規響應對象發送響應(response.print(SOME_JSON))。
有人可以幫我嗎?我有一種感覺,這是因爲我誤解了異步API的工作原理。我認爲我可以將這些AsyncContext存儲在全局映射中,然後檢索它們並使用它們的響應對象將事物推送到客戶端。但是,它似乎並不像AsyncContexts可以寫回客戶端。
任何幫助將被處理。