2013-10-13 4 views
1

Je souhaite que la demande de gestion du contrôleur (Spring MVC) se fasse en parallèle. J'utilise @Callable ci-dessous et cela ne fonctionne pas, parce que la prochaine demande est traitée depuis le premier terminé (renvoie la vue).Le traitement asynchrone de la requête ne fonctionne pas

@RequestMapping(method = RequestMethod.GET) 
public Callable<String> helloWorld(final Model model) throws InterruptedException { 
    return new Callable<String>() { 
     @Override 
     public String call() throws Exception { 
      Thread.sleep(5000); 
      return "helloWorld"; 
     } 
    }; 
} 

Ai-je besoin d'un code spécial?

+0

Quelles sont vos attentes? –

+0

Lorsque Callable est renvoyé, la deuxième requête déclenche helloWorld. Mais en réalité il attend jusqu'au premier appel "helloWorld". – pawb4r

Répondre

2

Les documentation for Spring MVC indique ce qui suit à propos du type Callable<?> de retour pour les méthodes de gestionnaire

A appelable peut être retourné lors de l'application veut produire la valeur de retour de manière asynchrone dans un thread géré par Spring MVC.

printemps prendra la Callable retourné par exemple, passer à un ExecutorService (ne fait plus le traitement alors que cela, mais pour simplifier) ​​et l'exécuter dans un autre Thread alors votre demande initiale. Après avoir attendu 5 secondes, la vue associée au nom de vue sera renvoyée "helloWorld".

+0

Je peux voir callable est géré dans un autre thread, mais pourquoi la prochaine demande doit attendre que la première extrémité soit traitée dans un autre thread. Je pensais que des requêtes entières seraient traitées en parallèle ... – pawb4r

+0

Comment comprendre ce fragment de documentation? Au lieu de renvoyer une valeur, comme d'habitude, une méthode de contrôleur peut maintenant retourner un java.util.concurrent.Callable et produire la valeur de retour à partir d'un thread distinct. Pendant ce temps, le thread principal du conteneur Servlet est libéré et autorisé à traiter d'autres requêtes. – pawb4r

+3

@ pawb4r Cela fonctionne très bien. N'essayez simplement pas les deux demandes sur le même navigateur. Par exemple, chrome se rendra compte qu'il envoie la même demande et n'en enverra qu'une seule à la fois. –

Questions connexes