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.