Dans le printemps MVC3.2 et supérieur, le traitement asynchrone des demandes est ajouté, qui est encapsulé sur la base du servlet3.
1. Modifier web.xml
<? xml version = "1.0" encoding = "utf-8"?> <web-app version = "3.0" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: scheMalation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> ... </ web-app>
1.1. Declare Version = "3.0", déclarez Web-App_3_0.xsd
1.2. Activer la prise en charge asynchrone pour les paramètres du servlet ou du filtre: <asynchronisé> true </ async-supporté> pour modifier le web.xml de l'application Web
<! - Spring MVC -> <Servlet> <Servlet-name> Springmvc </vrlett-name> <servlet-class> org.springframework.web.servlet.dispatcherservlet </ servlet-Class> <Init-Param> <param-name> contourner extconfiglocation </ param-name> <param-value> ... </ param-value> </ init-param> <charge-on-startup> 1 </ losh-on-startup> <async-supporté> true </ async-supported> </vrlet>
2. Faites de la prise en charge de la classe de contrôleur asynchrone
2.1. Retourner java.util.concurrent.
package org.springframework.sample.mvc.async; import java.util.concurrent.Callable; import org.springframework.sterreotype.Controller; import org.springframework.ui.model; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.requestParam; import org.springframework.web.bind.annotation.Responsebody; import org.springframework.web.context.request.async.webasyncTask; @ Contrôleur @ requestmapping ("/ async / callable") public class calleableController {@RequestMapping ("/ Response-body") public @ResponseBody callable <string> callable () {return new Callable <string> () {@Override public string public () lance l'exception {thread.sleep (2000); Renvoie "Résultat appelé"; }}}; } @RequestMapping ("/ View") public Callable <string> callableWithView (modèle final modèle) {return new Callable <string> () {@Override public String compall () lève exception {thread.sleep (2000); Model.AddAttribute ("Foo", "Bar"); Model.AddAttribute ("Fruit", "Apple"); return "vues / html"; }}; } @RequestMapping ("/ Exception") public @ResponseBody callable <string> callablewithexception (final @RequestParam (required = false, defaultValue = "true") booléen manipulé) {return new Callable <string> () {@Override public String Call () lance Exception {thread.sleep (2000); if (manipulé) {// Voir la méthode HandleException plus ci-dessous lancez un nouveau IllégalStateException ("Erreur callable"); } else {lance un nouveau IllégalArgumentException ("Erreur callable"); }}}}}; } @RequestMapping ("/ personnalisé-temps-handling") public @ResponseBody webaSyncTask <string> callablewithCustomtimeAndandling () {callable <string> callable = new callable <string> () {@Override public String call () lance l'exception {thread.sleep (2000); Renvoie "Résultat appelé"; }}; return new WebaSyncTask <string> (1000, callable); } @ExceptionHandler @ResponseBody Public String HandleException (illégalStateException ex) {return "Exception gérée:" + ex.getMessage (); }}2.2. Return org.springframework.web.context.request.async.deferredResult lorsque le traitement asynchrone est terminé, comme un JMS ou un message AMQP, une notification Redis, etc.:
@RequestMapping ("/ Quotes") @ ResponseBodyPublic DeferRredResult <string> Quotes () {DeferRredreSult <string> DeferRreSult = new DeferredreSult <string> (); // Ajouter un reportage à une file d'attente ou à une carte ... RETOUR DE REFORMERRÉSULT;} // Dans un autre thread ... DeferredreSult.SetResult (données); // supprimer le report de la file d'attente ou la carte3. Modification du fichier de configuration de ressort
La déclaration du DTD du printemps MVC doit être supérieure ou égale à 3.2
<MVC: annotation-Driven> <! - Vous pouvez utiliser le délai de délai par défaut -> <MVC: Async-Support Default-Timeout = "3000" /> </ MVC: Annotation-Driven>
Exemples d'utilisation réels:
fonction deferred () {$ .get ('quotes.htm', fonction (data) {console.log (data); Deferred (); // chaque fois que la demande est terminée, envoyez une autre demande pour éviter que le client ne rafraîchisse régulièrement pour obtenir des données});} L'avantage de le faire évite l'utilisation à long terme du pool de connexion du serveur Web, causant des problèmes de performances. Après l'appel, un thread de service non Web est généré pour le traiter, augmentant le débit du serveur Web ~~
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.