2015-07-28 4 views
2

У меня есть приложение 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 секунд, мне нужен сервер, который немедленно отвечает, когда кто-то пишет новое сообщение, а не в течение таймаута.

ответ

0

Я просто была такая же проблема, и я наткнулся на этот похожий вопрос: Tomcat 7 server error after 10 seconds when long polling

В принципе, вы должны сказать Tomcat не тайм-аут. Вы делаете это, редактируя файл Tomcat server.xml (в вашем каталоге conf), чтобы включить параметр asyncTimeout. Это скажет ваш сервер Tomcat таймаут через минуту:

<Connector port="8080" protocol="HTTP/1.1" asyncTimeout="60000" connectionTimeout="20000" redirectPort="8443" />

Используя значение -1 указывает Tomcat, чтобы никогда не тайм-аут.

Смежные вопросы