У меня проблемы с установкой AsyncContexts для пользователей и использованием их для отправки им уведомлений.При загрузке страницы у меня есть некоторый код jQuery для отправки запроса:
$.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Похоже, что Dragonfly (инструмент отладки, такой как Firebug) отправляет ответ HTTP 500 через 30000 мс после отправки запроса.
Любые ответы, созданные с помощью userAsyncContext.getResponse (). GetWriter (). Print (SOME_JSON).) и отправлено до того, как ответ HTTP 500 не получен браузером, и я не знаю почему.Использование обычного объекта ответа для отправки ответа (response.print (SOME_JSON)) принимается браузером ТОЛЬКО если отсутствует весь код в операторе «if», касающемся AsyncContext.
Может кто-нибудь мне помочьиз?У меня есть ощущение, что это связано с моим неправильным пониманием того, как работает асинхронный API.Я думал, что смогу сохранить эти AsyncContexts в глобальной карте, затем извлечь их и использовать их объекты ответа, чтобы передавать вещи клиентам.Однако не похоже, что AsyncContexts может выполнить обратную запись для клиентов.
Любая помощь будет оценена.