2015-07-28 1 views
2

J'ai une application Spring MVC 3.2 et j'ai besoin d'ajouter une interrogation longue à ce service Web pour un chat en temps réel. J'ai suivi cet article Spring MVC 3.2 Preview: Chat Sample.Printemps longue interrogation avec 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); 
          } 
         } 

    } 

Maintenant, le problème est:

quand je l'appelle "/ {TopicId}/mises à jour" s'il n'y a pas de réponse après 30 secondes le retour du serveur Erreur 500, si quelqu'un a écrit un message le serveur renvoie le bon message mais le serveur répond toujours après 30 secondes, j'ai besoin que le serveur réponde immédiatement quand quelqu'un écrit un nouveau message et pas au processus de délai.

Répondre

0

Je viens d'avoir le même problème, et je suis tombé sur cette même question: Tomcat 7 server error after 10 seconds when long polling

Fondamentalement, vous devez dire Tomcat pas de délai d'attente. Pour ce faire, éditez votre fichier Tomcat server.xml (dans votre répertoire conf) pour inclure un paramètre asyncTimeout. Cela prévenez votre Tomcat à délai d'attente après une minute:

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

En utilisant une valeur de -1 indique Tomcat de ne jamais délai d'attente.