introducción
En el procesamiento de negocios, algunas empresas usan métodos asíncronos más razonables. Por ejemplo, en una determinada lógica comercial, algunos datos se almacenan en el caché Redis. El caché es solo una función auxiliar. El éxito o el fracaso no tendrán un impacto fundamental en el negocio principal. Este proceso se puede llevar a cabo a través de un método asincrónico.
En primavera, el método se puede llamar asincrónicamente estableciendo la anotación @async en el método. Es decir, el método volverá inmediatamente tras la invocación, y la ejecución real de este método se entrega al Taskexecutor de Spring para completar.
Ejemplo de código
El proyecto es un proyecto de primavera normal, archivo de configuración de primavera:
<? xml versión = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" "" "" xmlns: context = "http://www.springframework.org/schema/context" xmlns: tareas = "http://www.springframework.org/schema/Task" xsi: schemalocation = "http://www.springframework.org/schem http://www.springframework.org/schema/Beans/spring-Beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-contexsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd "> <! Base-Package = "com.lzumetal.ssm"/> <!-Grupo de subprocesos para ejecutar tareas asíncronas Taskexecutor-> <tarea: ejecutor id = "myExecutor" piscol-size = "5"/> <tarea: annotation-driven ejecutor = "myExeCutor"/> </juels>
Dos clases de servicio:
paquete com.lzumetal.ssm.anotation.service; import org.slf4j.logger; import org.slf4j.loggerFactory; import org.springframework.beanss.factory.annotation.aUtowired; import og.springfframework.stereotype.service; import java.util..aUtewrent; java.util.concurrent.future;/** * Servicio comercial */@ServicePublic Clase BusinessService {private static final logger log = loggerFactory.getLogger (BusinessService.class); @Autowired privado Cacheservice Cacheservice; public void Dobusiness () {log.error ("Comience a tratar con nuestro negocio"); Cacheservice.cachedata (); log.error ("Operación de servicio Comlete"); } / *** Obtener el valor de retorno para la ejecución del método asíncrono* / public void Dobusinesswithasyncreturn () lanza ExecutionException, InterruptedException {log.error ("Comience a tratar con nuestro negocio"); Futuro <String> futuro = Cacheservice.cachedatawithreturn (); log.error (futuro.get ()); //future.get () El método es un bloque de bloqueo. }} paquete com.lzumetal.ssm.anotation.service; import org.slf4j.logger; import org.slf4j.loggerFactory; import org.springframework.scheduling.annotation.async; import og.springframework.scheduling.annotation.asyncresult; import; import org.springframework.stereotype.service; import java.util.concurrent.future; import java.util.concurrent.timeunit;/*** cache service*/@servicePublic Class Cacheservice {private estático final de logger = loggerFactory.getLogger (cacheservice.class); @Async (value = "myExecutor") // especifique el taskexecutor para ejecutar la tarea public void cachedata () {try {timeUnit.seconds.sleep (3l); } catch (InterruptedException e) {E.PrintStackTrace (); } log.error ("STARED almacene el resultado en caché"); } @Async public Future <String> Cachedatawithreturn () {try {timeUnit.seconds.sleep (3l); } catch (InterruptedException e) {E.PrintStackTrace (); } log.error ("STARED almacene el resultado en caché"); // El resultado devuelto debe ser envuelto por la clase Asyncresult return New Asyncresult <> ("Async Operation éxito"); }}Clase de prueba:
paquete com.lzumetal.ssm.anotation.test; import org.springframework.test.context.contextConfiguration; import org.springframework.test.context.junit4.springjunit4classrunner; import java.util.concurrent.timeunit; @runwith (springjunit4classrunner.class) @contextconfiguration (localización = {"classpath: spring-context.xml"}) public class Mantest {@aUtowired private BusinessService BusinessService; @Test public void test () lanza interruptedException {BusinessService.Dobusiness (); // No permita que el hilo principal termine demasiado temprano, de lo contrario, la consola no verá el contenido de salida en el método asíncrono TimeUnit.seconds.sleep (5L); } @Test public void talesyncreturn () lanza la excepción {BusinessService.Dobusinesswithasyncreturn (); TimeUnit.seconds.Seep (5L); }}El resultado de ejecutar el método test ():
22: 20: 33,207 Información Soporte principal. DefaultTestContextBootstraPper: 260 - Nombres de clases TestExecutionListener predeterminados cargados de la ubicación [Meta -Inf/Spring.Factories]: [org.springframework.test.context.web.servlettExecutionListener, org. org.springframework.test.context.transaction.transactionalTeSexecutionListener, org.springframework.test.context.jdbc.sqlscriptsteSteCutenerListener]
22: 20: 33,226 Información Soporte principal. DefaultTestContextBootstraPper: 209 - No pudo instanciar testExecutionListener [org.springframework.test.context.web.servlettestExeCuConionListener]. Especifique las clases de oyentes personalizadas o haga que las clases de oyente predeterminadas (y sus dependencias requeridas) estén disponibles. Clase ofensiva: [Javax/Servlet/ServletContext]
22: 20: 33,227 Información Soporte principal. DefaultTestContextBootstrapper: 187 - Uso de testExecutionListeners: [org.springframework.test.context.support.dirtiescontextbeforemodeStexecutionListener@100fc185, org.springframework.test.context.support.dependencyTyectionTestExecutionListener@643b1d11, org.springframework.test.context.support.dirtiescontextTeStexecutionListener@2eF5E5e3, org.springframework.test.context.transaction.transactionalTeSexecUcutionListener@36d4b5c, org.springframework.test.context.jdbc.sqlscriptsteSc. Definiciones de bean XML del recurso de ruta de clase [Spring-Context.xml]
22: 20: 33,585 Información Soporte principal. APLICACIÓN GENERICACTEXTEX: 583 - Refrescante org.springframework.context.support.genericapplicationcontext@4f7d0008: fecha de inicio [miércoles 30 de mayo 22:20:33 CST 2018]; raíz de la jerarquía de contexto
22: 20: 33,763 información principal concurrente. Threadpooltaskexecutor: 165 - Inicializando EjecutorService
22: 20: 33,766 Información Soporte principal. PostProcessorRegistrationDelegate $ beanprocessorschecker: 325 - bean 'myExecutor' de type [org.springframework.scheduling.config.taskexecutoryBean] no es elegible para ser procesado por todos los beanproccessors (por ejemplo, no elige) para autóctonos) para autóctonos) para autóctonos) para los behyproccessors (no no es eligable) para autócratas: no es elige) para autócratas.
22: 20: 33,767 Información Soporte principal. PostProcessorRegistrationDelegate $ beanprocessorsChecker: 325 - Bean 'myExecutor' de tipo [org.springframework.scheduling.concurrent.threadpooltaskexecutor] no es elegible para ser procesado por todos los beanpostPossors (por ejemplo, por ejemplo: no elige: no elige para el otoño.
22: 20: 34,107 Error Servicio principal. BusinessService: 24 - Comience a tratar con nuestro negocio
22: 20: 34,113 Error Servicio principal. BusinessService: 26 - Operación de servicio completa
22: 20: 37,166 Error MyExecutor -1 Service.
22: 20: 39,117 Información de hilo -0 soporte. GenericApplicationContext: 984 - Cerrar org.springframework.context.support.genericapplicationcontext@4f7d0008: Fecha de inicio [miércoles 30 de mayo 22:20:33 CST 2018]; raíz de la jerarquía de contexto
22: 20: 39,118 Info Hilo -0 concurrente. Threadpooltaskexecutor: 203 - Cerrar EjecutorService
El resultado de ejecutar el método talesyncreturn ():
21: 38: 16,908 Información Soporte principal. DefaultTestContextBootstrapper: 260 - Nombres de clases de TestExecutionListener predeterminado cargados de la ubicación [Meta -Inf/Spring.Factories]: [org.springframework.test.context.web.servlettestexecutionListener, org. org.springframework.test.context.transaction.transactionalTeSexecutionListener, org.springframework.test.context.jdbc.sqlscriptsteSteCutenerListener]
21: 38: 16,926 Información Soporte principal. DefaultTestContextBootstraPper: 209 - No pudo instanciar testExecutionListener [org.springframework.test.context.web.servlettestExeCutionListener]. Especifique las clases de oyentes personalizadas o haga que las clases de oyente predeterminadas (y sus dependencias requeridas) estén disponibles. Clase ofensiva: [Javax/Servlet/ServletContext]
21: 38: 16,927 Información del soporte principal. DefaultTestContextBootstrapper: 187 - Uso de testExecutionListeners: [org.springframework.test.context.support.dirtiescontextbeforemodeStexecutionListener@100fc185, org.springframework.test.context.support.dependencyTyectionTestExecutionListener@643b1d11, org.springframework.test.context.support.dirtiescontextTeStexecutionListener@2eF5E5e3, org.springframework.test.context.transaction.transactionalTeSexecutEdListener@36d4b5c, org.springframework.test.context.jdbc.sqlscriptsteSc. Definiciones de bean XML del recurso de ruta de clase [Spring-Context.xml]
21: 38: 17,263 Información Soporte principal. APLICACIÓN GENERICACTINEXT: 583 - Refrescante org.springframework.context.support.genericApplicationContext@4f7d0008: Fecha de inicio [miércoles 30 de mayo 21:38:17 CST 2018]; raíz de la jerarquía de contexto
21: 38: 17,405 Información principal concurrente. Threadpooltaskexecutor: 165 - Inicializando EjecutorService
21: 38: 17,407 Información Soporte principal. PostProcessorRegistrationDelegate $ BeanPostProcessCessChecker: 325 - Bean 'MyExecutor' de tipo [org.springframework.scheduling.config.taskexecutoryBean] no es elegible para ser procesado por todos los bean -procutors (por ejemplo: no eligratando) para autócratas) para autóctonos) para autóctonos: no es eligable para los beaness)
21: 38: 17,407 Información Soporte principal. PostProcessorRegistrationDelegate $ BeanPoSprocessCessChecker: 325 - Bean 'myExecutor' de tipo [org.springframework.scheduling.concurrent.threadpooltaskexecutor] no es elegible para ser procesado por todos los beanpostesors (por ejemplo, por ejemplo, no eligibles para el otoño.
21: 38: 17,692 Error Servicio principal. BusinessService: 35 - Comience a tratar con nuestro negocio
21: 38: 20,833 Error MyExecutor -1 Service.
21: 38: 20,834 Error Servicio principal. BusinessService: 37 - Async Operation éxito
21: 38: 20,835 Servicio principal de error.
21: 38: 25,838 Info Support Support. GenericApplicationContext: 984 - Cerrar org.springframework.context.support.genericApplicationContext@4f7d0008: Fecha de inicio [miércoles 30 de mayo 21:38:17 CST 2018]; raíz de la jerarquía de contexto
21: 38: 25,839 Información Hild -0 concurrente. ThreadPoolTaskExecutor: 203 - Apagando EjecutorService
@Puntos de uso de Async
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.