introdução
No processamento de negócios, algumas empresas usam métodos assíncronos mais razoáveis. Por exemplo, em uma certa lógica de negócios, alguns dados são armazenados no cache Redis. O cache é apenas uma função auxiliar. Sucesso ou fracasso não terá um impacto fundamental nos principais negócios. Esse processo pode ser realizado através de um método assíncrono.
Na primavera, o método pode ser chamado de forma assíncrona, definindo a anotação @async no método. Ou seja, o método retornará imediatamente após a invocação, e a execução real desse método é entregue ao Taskexecutor da Spring para concluir.
Exemplo de código
O projeto é um projeto normal de primavera, arquivo de configuração de primavera:
<? xml versão = "1.0" coding = "utf-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http:/wwww.w3 xmlns:context="http://www.springframework.org/schema/context" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task http://www.springframework.org/schema/Task/Spring-Task.xsd.xsd "> <! Base-Package = "com.lzumetal.ssm"/> <!-Pool de threads para executar tarefas assíncronas taskexecutor-> <tarefa: executor id = "myexecutor" pool-size = "5"/> <tarefa: executora de anotação drafada = "myexecutor"/> </beans>
Duas aulas de serviço:
pacote com.lzumetal.ssm.anotation.service; importar org.slf4j.logger; importar org.slf4j.loggerFactory; importar org.springframework.beans.factory.annotation.autowired java.util.concurrent.future;/** * Serviço de negócios */@ServicePublic Classe BusinessService {private estático Logger final Log = LoggerFactory.getLogger (BusinessService.class); @Autowired Private CacheService CacheService; public void Dobusiness () {Log.error ("Comece a lidar com nossos negócios"); CacheService.cachedata (); log.error ("operação de serviço do comlete"); } / *** Obtenha o valor de retorno para a execução do método assíncrono* / public void DobusinessWithasyncreturn () lança ExecutionException, interruptedException {Log.error ("Comece a lidar com nossos negócios"); Futuro <string> futuro = cacheService.cachedatawithreturn (); log.error (futura.get ()); //future.get () Método é um log.error de bloqueio ("operação de serviço do comlete"); }} pacote com.lzumetal.ssm.anotation.service; importar org.slf4j.logger; importar org.slf4j.loggerFactory; importar org.springframework.scheduling.annotation.async; importar org.springframework.scheduling.annotation.asynyn; org.springframework.stereotype.service; importar java.util.concurrent.future; importar java.util.concurrent.timeUnit;/*** serviço de cache*/@ServicePublic class (CacheService {private static Logger Log = LoggerFactory.getLogger (CacheService @Async (value = "myExecutor") // Especifique o taskexecutor para executar a tarefa public void Cachedata () {try {timeUnit.seconds.sleep (3L); } catch (interruptedException e) {e.printStackTrace (); } log.error ("SUCCEST SOPORTE O resultado do cache"); } @Async public Future <String> cacheDatawithRurn () {try {timeUnit.seconds.sleep (3L); } catch (interruptedException e) {e.printStackTrace (); } log.error ("SUCCEST SOPORTE O resultado do cache"); // O resultado retornado precisa ser envolvido pela classe Asyncresult Return New Asyncresult <> ("Sucesso da Operação ASYNC"); }}Classe de teste:
pacote com.lzumetal.ssm.anotation.test; importar com.lzumetal.ssm.anotation.service.businessservice; importar org.junit.test; importar org.junit.runner.runwith; importar org.springframework.beanS.factory.annOtation.aNOTOWHTOWHTOWHTOWTH; org.springframework.test.context.contextConfiguration; importar org.springframework.test.context.junit4.springjunit4classrunner; import java.util.concurrent.timeunit; @runwith (springjunit4clsrwitsrunner.cl) {"ClassPath: Spring-Context.xml"}) Classe pública Melhorest {@aUTowired Private Business Service BusinessService; @Test public void test () lança interruptedException {BusinessService.Dobusiness (); // Não deixe que o encadeamento principal termine muito cedo, caso contrário, o console não verá o conteúdo de saída no método assíncrono TimeUnit.Seconds.Sleep (5L); } @Test public void testAsyncreturn () lança exceção {BUSINESSERVICE.DOBUSINEINDWITHASYNCRETURN (); TimeUnit.Seconds.Sleep (5L); }}O resultado da execução do método test ():
22: 20: 33.207 Informações Principais suporte.DefaultTestContextBootStrapper: 260 - carregou nomes de classe padrão do TestExecutionListener da localização [meta -inf/spring.factories]: [org.springframework.test.context.web.servleTleTexecutionListener, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener, org.springframework.test.context.support.DependencyInjectionTestExecutionListener, org.springframework.test.context.support.DirtiesContextTestExecutionListener, org.springframework.test.context.transaction.TransactionAlTestExecutionListener, org.springframework.test.context.jdbc.sqlScriptStestestExecutionListener]
22: 20: 33.226 Informações Principais suporte. Especifique classes de ouvinte personalizadas ou disponibilize as classes de ouvinte padrão (e suas dependências necessárias). Classe ofensiva: [Javax/Servlet/ServletContext]
22: 20: 33.227 Informações Principais suporte. org.springframework.test.context.support.DependencyInjectionTestExecutionListener@643b1d11, org.springframework.test.context.support.dirtiescontexttexecutionListener@2efort.support.dirtiescontexttexecutionListener@2EF5E5E5, org.springframework.test.context.transaction.TransactionAlTestExecutionListener@36D4B5C, org.springframework.test.context.jdbc.sqlscriptststexecutionListener@6d00a15d] 22: 20: 33.3. Definições de feijão xml do recurso de caminho da classe [spring-context.xml]
22: 20: 33.585 Informações Principais suporte.GenericApplicationContext: 583 - refrescante org.springframework.context.support.genericApplicationContext@4f7d0008: data de inicialização [Qua de 30 de maio 22:20:33 CST 2018]; raiz da hierarquia de contexto
22: 20: 33.763 Informações Main Concurrent.threadpooltaskexecutor: 165 - Inicializando o ExecorService
22: 20: 33.766 Informações Principais suporte. Proflexão automática)
22: 20: 33.767 Informações Principais suporte. Proflexão automática)
22: 20: 34.107 Erro Serviço principal.BusinessService: 24 - Comece a lidar com nossos negócios
22: 20: 34.113 Erro Serviço principal.
22: 20: 37.166 Erro MyExecutor -1 Service.CacheService: 28 - Success Store o resultado do cache
22: 20: 39.117 Info Thread -0 support.genericApplicationContext: 984 - fechamento org.springframework.context.support.genericapplicationContext@4f7d0008: data de inicialização [qua de 30 maio 22:20:33 CST 2018]; raiz da hierarquia de contexto
22: 20: 39.118 Info Thread -0 simulta
O resultado da execução do método TestAsyncreTurn ():
21: 38: 16.908 Informações Principais suporte.DefaultTestContextBootStrapper: 260 - Nomes de classe de TestExecutionListener padrão carregados da localização [meta -inf/spring.factories]: [org.springframework.test.context.web.servleTlettexecutionListner, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener, org.springframework.test.context.support.DependencyInjectionTestExecutionListener, org.springframework.test.context.support.DirtiesContextTestExecutionListener, org.springframework.test.context.transaction.TransactionAlTestExecutionListener, org.springframework.test.context.jdbc.sqlScriptStestestExecutionListener]
21: 38: 16.926 Informações Principais suporte. Especifique classes de ouvinte personalizadas ou disponibilize as classes de ouvinte padrão (e suas dependências necessárias). Classe ofensiva: [Javax/Servlet/ServletContext]
21: 38: 16.927 Informações Principais suporte. org.springframework.test.context.support.DependencyInjectionTestExecutionListener@643b1d11, org.springframework.test.context.support.dirtiescontexttexecutionListener@2efort.support.dirtiescontexttexecutionListener@2EF5E5E5, org.springframework.test.context.transaction.TransactionAlTestExecutionListener@36d4b5c, org.springframework.test.context.jdbc.sqlscriptststexecutionListener@6d00a15d] 21: 38: 17,025 Definições de feijão xml do recurso de caminho da classe [spring-context.xml]
21: 38: 17.263 Informações Principais suporte. raiz da hierarquia de contexto
21: 38: 17.405 Informações Main Concurrent.Threadpooltaskexecutor: 165 - Inicializando o ExecorService
21: 38: 17.407 Informações Principais suporte. Proflexão automática)
21: 38: 17.407 Informações Principais suporte. Proflexão automática)
21: 38: 17.692 Erro Serviço principal.BusinessService: 35 - Comece a lidar com nossos negócios
21: 38: 20.833 Erro MyExuctor -1 Service.CacheService: 39 - Sucesso armazene o resultado para cache
21: 38: 20.834 Erro Serviço principal.BusinessService: 37 - Sucesso da operação assíncrona
21: 38: 20.835 Erro Serviço principal.BusinessService: 38 - Operação completa de serviço
21: 38: 25.838 Info Thread -0 support.GenericApplicationContext: 984 - fechando org.springframework.context.support.genericapplicationContext@4f7d0008: data de inicialização [quarta -feira 30 21:38:17 CST 2018]; raiz da hierarquia de contexto
21: 38: 25.839 Info Thread -0 Concurrent.threadpooltaskexecutor: 203 - Desligando o ExecorService
@Pontos de uso do Async
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.