Na primavera MVC3.2 e acima, é adicionado processamento assíncrono de solicitações, que é encapsulado com base no servlet3.
1. Modificar 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: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> ... </web-App>
1.1. Declarar versão = "3.0", declarar web-app_3_0.xsd
1.2. Ativar suporte assíncrono para configurações de servlet ou filtro: <sync-supported> true </sync-suported> para modificar o web.xml do aplicativo da web
<!- Spring MVC -> <Verlet> <Verlet-name> springmvc </servlet-name> <Servlet-class> org.springframework.web.servlet.dispatcherServlet </servlet-class> <iit-param> <amam-name> cont ExtConfigLocation </amam-name> <amam-value> ... </param-value> </irit-param> <adound-on-startup> 1 </load-on-startup> <sync-supported> true </sync-supported> </servlet>
2. Faça o suporte da classe do controlador assíncrono
2.1. Retorne java.util.Concurrent.
pacote org.springframework.samples.mvc.async; importar java.util.Concurrent.Callable; importar org.springframework.tereotype.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; importar org.springframework.web.context.request.async.webasynctask; @Controlador @requestmapping ("/async/callable") classe pública callableController {@RequestMapping ("/Response-body") public @ResponseBody Callable <String> callable () {return novo callable <string> () {@Override public String () THROws Exception {Thread.sleep (2000); retornar "resultado chamável"; }}}; } @RequestMapping ("/View") public Callable <String> callablewithView (modelo final) {return novo callable <tring> () {@Override public String Call () lança a exceção {thread.sleep (2000); model.addattribute ("foo", "bar"); Model.Addattribute ("Fruit", "Apple"); retornar "visualizações/html"; }}; } @RequestMapping ("/Exception") public @ResponseBody Callable <String> callableWithException (final @RequestParam (requerir = false, defaultValue = "true") boolean manipulado) {return novo callable <sting> () {@Override public String () Exception {Thread.sleep (2000); se (manipulado) {// consulte o método HandleException mais abaixo, lança a nova ilegalStateException ("erro chamável"); } else {lança novo ilegalArgumentException ("erro chamável"); }}}}}; } @RequestMapping ("/Custom-timeout-manyling") public @ResponseBodyBody WebAsyncTask <String> callableWithCustomTimeoutHandling () {Callable <String> callable = new Callable <string> () {@Override public String Call () Throws Exception {Thread {.Sleep (2000); retornar "resultado chamável"; }}; retornar novo webAsyncTask <String> (1000, chamável); } @ExceptionHandler @ResponseBody Public String HandleException (ilegalStateException Ex) {return "Lidou Exceção:" + ex.getMessage (); }}2.2. Retornar org.springframework.web.context.request.async.deferredResult Quando o processamento assíncrono é concluído, como um JMS ou uma mensagem AMQP, notificação Redis, etc.:
@RequestMapping ("/Quotes")@ResponseBodyPublic DeferredResult <String> Quotes () {DeferredResult <String> adeferredResult = new DeferredResult <String> (); // Adicione o adiFerredResult a uma fila ou um mapa ... return diferredResult;} // em algum outro tópico ... adeferredResult.setResult (dados); // remova3. Modificação do arquivo de configuração da mola
A declaração do DTD do MVC da primavera deve ser maior ou igual a 3,2
<MVC: anotação-driven> <!-você pode usar o tempo limite padrão-> <mvc: assíncrono-support padrão-timeout = "3000"/> </mvc: anotação-driven>
Exemplos de uso real:
function diferred () {$ .get ('quotes.htm', function (data) {console.log (data); adeferred (); // sempre que a solicitação é concluída, envie outra solicitação para evitar a atualização do cliente regularmente para obter dados});} A vantagem de fazer isso evita o uso a longo prazo do pool de conexões do servidor da Web, causando problemas de desempenho. Após a chamada, um segmento de serviço não-web é gerado para processá-lo, aumentando a taxa de transferência do servidor da web ~~
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.