У меня есть приложение Spring MVC 3.2, и мне нужно добавить длинный опрос на этот веб-сервис для чата в режиме реального времени. Я следовал этой статье Spring MVC 3.2 Preview: Chat Sample.Весенний длинный опрос с deferredResult
TopicRestController:
private final Map<DeferredResult<String>, Long> chatRequests =
new ConcurrentHashMap<DeferredResult<String>, Long>();
@RequestMapping(value="/{topicId}/updates" , method=RequestMethod.POST)
public @ResponseBody DeferredResult<String> isNewTopic(
@PathVariable Long topicId,
Model model, HttpSession session,
@RequestParam(required = true) String data) throws InterruptedException, CircularDefinitionException{
logger.info("New long polling request "+topicId);
final DeferredResult<String> result = new DeferredResult<String>();
this.chatRequests.put(result, topicId);
result.onCompletion(new Runnable() {
@Override
public void run() {
chatRequests.remove(result);
logger.info("Remove request from queue!");
}
});
Timestamp timestamp = new Timestamp(Long.valueOf(data)*1000L);
String updates = talkService.findNewTopicResponce(topicId,timestamp);
if (!updates.isEmpty()) {
result.setResult(updates);
}
return result;
}
@RequestMapping(value= "/{categoryId}" + "/addAnswer", method=POST)
public @ResponseBody Map respTopic(
@PathVariable Long categoryId,
@RequestParam String msg,
@RequestParam(required = false) String imageUrl,
@RequestParam(required = false) String title,
@RequestParam long talkId,
HttpServletRequest request
) throws CircularDefinitionException, MessagingException,TalkNotExistException{
........................
for (Entry<DeferredResult<String>, Long> entry : this.chatRequests.entrySet()){
if(entry.getValue().equals(talkId)){
entry.getKey().setResult(""+talkId);
}
}
}
Теперь проблема:
, когда я называю "/ {TopicID}/обновления", если нет никакого ответа после 30 секунд возврата Ошибка сервера 500, если кто-то написал сообщение, сервер возвращает правильное сообщение, но сервер всегда отвечает через 30 секунд, мне нужен сервер, который немедленно отвечает, когда кто-то пишет новое сообщение, а не в течение таймаута.