Im Frühjahr MVC3.2 und höher wird eine asynchrone Verarbeitung von Anforderungen hinzugefügt, die basierend auf Servlet3 eingekapselt ist.
1. Modify web.xml
<? XSI: Schemalocation = "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", deklarieren Sie web-App_3_0.xsd
1.2. Aktivieren Sie die asynchrone Unterstützung für Servlet- oder Filtereinstellungen: <Async-unterstützt> true </async-unterstützt>, um die web.xml der Webanwendung zu ändern
<!- Spring MVC -> <servlet> <servlet-name> springmvc </servlet-name> <servlet-classe> org.springframework.web.servlet.dispatcherServlet </servlet-class> <init-param> <param-name> cont extconfigLocation </param-name> <param-value> ... </param-value> </init-param> <load-on-startup> 1 </load-on-startup> <async-supportiert> true </async-supportiert> </servlet>
2. Machen Sie die Controller -Klasse -Unterstützung asynchronisiert
2.1. Return java.util.concurrent.Callable, um die asynchrone Verarbeitung abzuschließen
Paket org.springFramework.samples.mvc.async; import Java.util.concurrent.callable; import org.springframework.stereotype.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; @Controller @RequestMapping ("/async/callable") public class callableController {@RequestMapPing ("/Antwort-Body") public @ResponseBody Callable <string> callable () {return New Callable <string> () {@override öffentlich String CALL () löst Ausnahme von {thread.sleep (2000); zurückgeben "Callable -Ergebnis"; }}}; } @RequestMapping ("/view") public Callable <string> callableWithView (endgültiges Modellmodell) {return New Callable <string> () {@Override public String call () löst Ausnahme aus {Thread.sleep (2000); model.addattribute ("foo", "bar"); model.addattribute ("Frucht", "Apfel"); zurück "Ansichten/HTML"; }}; } @RequestMapping ("/exception") public @ResponseBody Callable <string> CallableWitHexception (endgültig @RequestParam (erforderlich = false, defaultValue = "true") boolean Handled) {return New Callable <string> () {@override öffentliche String CALL () löst Ausnahme aus {thread.sleep (2000); if (gehandhabt) {// Siehe HandleException -Methode weiter unten werfen neue IllegalStateException ("Callable ERROR"); } else {werfen neuer illegalArgumentException ("Callable ERROR"); }}}}}; } @RequestMapping ("/benutzerdefinierte Zeitout-Handling") public @ResponseBody WebAsynctask <string> CALLABLEWITHCUSTOMTimeOuthStelling () {Callable <string> callable = new Callable <string> () {@Override public string call () löst Ausnahme aus {Thread.sleep (2000); zurückgeben "Callable -Ergebnis"; }}; Neue Webasynctask <string> (1000, Callable) zurückgeben; } @ExceptionHandler @ResponseBody public String handleException (illegalStateException ex) {return "behandelt:" + ex.getMessage (); }}2.2. Return org.springframework.web.context.request.async.DeferredResult Wenn asynchrone Verarbeitung abgeschlossen ist, z. B. eine JMS oder eine AMQP -Nachricht, Redis -Benachrichtigung usw.
@RequestMapping ("/Quotes")@responseBodypublic DeferredResult <string> zites () {DeferredResult <string> DeferredResult = new DeferredResult <string> (); // DeferredResult zu einer Warteschlange oder einer Karte hinzufügen ... Rücksender DeferredResult;} // In einem anderen Thread ... deferredResult.setResult (Daten); // DeferredResult aus der Warteschlange oder Karte entfernen3. Änderung der Federkonfigurationsdatei
Die Deklaration des Feder -MVC -DTD muss größer oder gleich 3,2 sein
<MVC: Annotationsgetrieben> <!-Sie können das Standard-Timeout verwenden-> <MVC: Async-Support-Default-Timeout = "3000"/> </mvc: Annotationsgetrieben>
Tatsächliche Verwendung Beispiele:
Funktion deferred () {$ .get ('quotes.htm', Funktion (Daten) {console.log (Daten); Deferred (); // Jedes Mal, wenn die Anforderung abgeschlossen ist, senden Der Vorteil, dies zu tun, vermeidet die langfristige Verwendung des Webserver-Verbindungspools und verursacht Leistungsprobleme. Nach dem Aufrufen wird ein Nicht-Web-Service-Thread generiert, um ihn zu verarbeiten, wodurch der Durchsatz des Webservers ~~ erhöht wird
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.