Na bota da primavera (MVC da primavera), as solicitações são sincronizadas por padrão. Um tópico é responsável pelo passado e final de uma solicitação. Em muitos casos, para melhorar a taxa de transferência, algumas operações precisam ser assincronizadas. Além de uma lógica de negócios demorada que pode ser assincronizada, nossa interface de consulta também pode ser executada de forma assíncrona.
Uma solicitação para o serviço é recebida por um tópico de um contêiner da web, como o thread http-nio-8084-exex-1
Podemos usar o WebAsyncTask para distribuir essa solicitação a um novo thread para execução, e o HTTP-NIO-8084-EXEC-1 pode receber processamento de outras solicitações. Depois que o WebAsyncTask retornará os dados, ele será chamado e processado novamente, e o valor será devolvido ao lado solicitado de maneira assíncrona.
O código de amostra é o seguinte:
@RequestMapping (Value = "/Login", Method = requestMethod.get) public webAsyncTask <ModandView> LongTimetak () {System.out.println ("/Login é chamado ID do thread é:" + Thread.CurrentThread (). GetName ()); Callable <ModelAndView> Callable = novo Callable <ModaNDView> () {public ModelAndView Call () lança Exceção {Thread.sleep (1000); /Simular tarefas de longo prazo ModelAndView MAV = new ModelAndView ("Login/Index"); System.out.println ("Execução O ID do thread bem -sucedido é:" + Thread.CurrentThread (). GetName ()); retornar mav; }}; Retorne o novo webAsyncTask <ModaNDView> (Callable);}Você pode ver o resultado da saída da seguinte maneira:
/Login é chamado ID do thread é: http-nio-8084-exex-1
Execução O ID do thread com sucesso é: MVCASYNC1
O tópico antes de executar a lógica de negócios e o tópico que lida especificamente com a lógica de negócios não são os mesmos, o que atinge nosso objetivo.
Então eu fiz um teste simultâneo e descobri que estava constantemente criando o thread MVCasync1. Eu estava pensando, o pool de threads não é usado?
Depois de ler o código -fonte, descobri que isso é verdade. WebAsyncManager é a classe central do Spring MVC para gerenciar o processamento assíncrono.
O padrão é usar o Simpleasynctaskexecutor, que criará um novo thread para cada solicitação.
ASYNCTASKEXECIONADOR DE PRIVADO TASKEXECIONCOTE = NOVO SIMELASENCTASKEXECION (this.getClass (). getSImpleName ());
Se a tarefa especificar um executor, use a tarefa especificar -a. Caso contrário, use o padrão Simplyasynctaskexecutor
Asynctaskexecutor Executor = webAsynctask.getexEctor (); if (executor! = Null) {this.taskexecutor = executor;}Podemos configurar o pool de threads da Async sem especificá -lo separadamente para cada tarefa
Especifique por Configurer.Settaskexecutor (ThreadPooltasKEXECOCONDOR ());
importar org.springframework.context.annotation.bean; importar org.springframework.context.annotation.configuration; importar org.springframework.scheduling.concurrent.threadpooltaskexecutor; org.springframework.web.context.request.async.TimeoutCallableProcessingInterceptor; importar org.springframework.web.servlet.config.annotation.asyncsupportConfigurer; import org.springframework.web.servlet.config.annotation.webmvcconfigurationsupport; @configurationpublic classe webmvcconfig estende webmvcconfigurationsuppport {@Overrcide public void ConfigureasyncsUpport (Finalmente asnyncorport {@Overrrid Public void configureasyncsUpport (final Configurer.SetDefaultTimeout (60 * 1000L); Configurer.ReGisterCallableInterceptores (timeoutInterceptor ()); Configurer.setTaskexecutor (ThreadPooltasKEXECECODOR ()); } @Bean Public timeoutCallableProcessingIntercept timeoutInterInterceptor () {retorna novo timeoutCallableProcessingInterceptor (); } @Bean Public ThreadPooltaskexecutor ThreadPooltasKEXecutor () {ThreadPooltaskexecutor t = new ThreadPooltaskexecutor (); t.setCorePoolSize (10); t.setMaxpoolSize (50); t.setThreadNamePrefix ("YJH"); retornar t; }}Após a configuração, você pode ver que o nome do thread de saída começa com YJH e novos threads não serão criados o tempo todo.
Você pode ver o resultado da saída da seguinte maneira:
/Login é chamado de ID do thread é: http-nio-8084-execution execução com êxito de thread com sucesso é: yjh1
Resumir
O exposto acima é o que o editor introduzido no Spring Boot usa WebAsyncTask para retornar os resultados de forma assíncrona. Espero que seja útil para todos. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a todos a tempo. Muito obrigado pelo seu apoio ao site wulin.com!