En la primavera MVC3.2 y superior, se agrega el procesamiento asincrónico de las solicitudes, que se encapsula en función de Servlet3.
1. Modificar web.xml
<? xml versión = "1.0" encoding = "utf-8"?> <web-app versión = "3.0" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> ... </seb-app>
1.1. Declarar versión = "3.0", declarar web-app_3_0.xsd
1.2. Habilite el soporte asíncrono para la configuración de servlet o filtro: <Sync-Supported> true </async-supported> para modificar el web.xml de la aplicación web
<!- Spring MVC -> <servlet> <servlet-name> springmvc </servlet-name> <ervlet-class> org.springframework.web.servlet.dispatcherservlet </servlet-class> <it-param> <amamname> cont. ExtConfigLocation </param-name> <amam-value> ... </marr-value> </it-param> <load-on-startup> 1 </load-on-startup> <async-supported> true </async-supported> </servlet>
2. Haga que el soporte de la clase del controlador async
2.1. Return java.util.concurrent.callable para completar el procesamiento asíncrono
paquete org.springframework.samples.mvc.async; import java.util.concurrent.callable; importar org.springframework.stereotype.controller; importar org.springframework.ui.model; importar org.springframework.web.bind.annotation.exceptionHandler; importar org.springframework.web.bind.annotation.requestMapping; importar org.springframework.web.bind.annotation.requestparam; importar org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.context.request.async.webasynctask; @Controlador @requestmapping ("/async/callable") public class CallableController {@RequestMapping ("/Respuesta-Body") public @ResponseBody Callable <String> Callable () {return New Callable <String> () {@Override public String Call () lanza Exception {Thread.Sele Lleep (2000); devolver "resultado llamable"; }}}; } @RequestMapping ("/View") Public Callable <String> CallableWithView (modelo final del modelo final) {return New Callable <string> () {@Override public String Call () lanza excepción {Thread.sleep (2000); model.addattribute ("foo", "bar"); Model.AddAttribute ("Fruit", "Apple"); devolver "Vistas/html"; }}; } @RequestMapping ("/Exception") public @ResponseBody Callable <String> CallableWithException (final @RequestParam (requerido = false, defaultValue = "true") Boolean Mandled) {return New Callable <String> () {@Override public String Call () Lanza la excepción {Thread.Seinge (2000); if (manejado) {// Consulte el método de HandleException más abajo, arroje nuevo IllegalStateException ("Error invocable"); } else {tirar nueva ilegalArgumentException ("Error invocable"); }}}}}; } @RequestMapping ("/Custom TimeOut-Handling") public @ResponseBody WebAsyncTask <String> CallableWithCustomTimeOuthandling () {Callable <String> Callable = new Callable <String> () {@Override public String Call () arroja una excepción {Thread.sleep (2000); devolver "resultado llamable"; }}; devolver nuevo WebasyncTask <String> (1000, llamable); } @ExceptionHandler @ResponseBody public String HandleException (ilegalStateException ex) {return "Exception:" + ex.getMessage (); }}2.2. Return org.springframework.web.context.request.async.deferredResult cuando se completa el procesamiento asíncrono, como un JMS o un mensaje AMQP, notificación redis, etc.:
@RequestMapping ("/Quotes")@ResponseBodyPublic DeferredResult <String> Quotes () {DeferRedResult <String> DeferRedResult = new DeferredResult <String> (); // Agregar diferenciado a una cola o un mapa ... returnfferredResult;} // En algún otro hilo ... DeferRedResult.setResult (datos); // Eliminar DferredResult de la cola o mapa3. Modificación del archivo de configuración de Spring
La declaración del DTD de primavera de MVC debe ser mayor o igual a 3.2
<mvc: annotation-riven> <!-puede usar el tiempo de espera predeterminado-> <mvc: async-support predeterminado timeout = "3000"/> </mvc: annotation-driven>
Ejemplos de uso real:
function DeferRed () {$ .get ('Quotes.htm', function (data) {console.log (data); diferido (); // Cada vez que se completa la solicitud, envíe otra solicitud para evitar que el cliente se actualice regularmente para obtener datos});} La ventaja de hacer esto evita el uso a largo plazo del grupo de conexión del servidor web, causando problemas de rendimiento. Después de llamar, se genera un hilo de servicio no WEB para procesarlo, aumentando el rendimiento del servidor web ~~
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.