1. Ejecución y programación de tareas
Spring utiliza las interfaces de Taskexecutor y TaskScheduler para proporcionar abstracciones para tareas de ejecución y programación asincrónicas.
El Taskexecutor de Spring es el mismo que la interfaz java.util.concurrent.executor. Esta interfaz tiene solo un método ejecutar (tarea runnable).
1.1. Tipo taskexecutor
Spring ha incorporado muchas implementaciones de Taskexecutor, y no necesita implementarlas usted mismo:
1.2. Anotaciones Apoyar la programación y la ejecución asincrónica
Para habilitar el soporte para las anotaciones @scheduled y @async agregue @enablescheduling y @enableaseNync a uno de sus
@Configuration Classes:@Configuration@endableasync@habilschedulingpublic clase appconfig {}Prestar especial atención
El modo de asesoramiento predeterminado para procesar anotaciones @Async es "proxy" que permite la interferencia de llamadas a través del proxy solamente; Las llamadas locales dentro de la misma clase no pueden ser interceptadas de esa manera. Para un modo de interferencia más avanzado, considere cambiar al modo "SuppeJ" en combinación con soldadura por tiempo de compilación o tiempo de carga.
Por defecto, @async se maneja con proxy. Por lo tanto, los métodos en la misma clase no pueden llamarse métodos asincrónicamente con @async, y esta situación sigue siendo sincrónica.
Por ejemplo: el siguiente, llamar a Sayshi () directamente se puede ejecutar de manera asincrónica, mientras que Sayichi () todavía se ejecuta sincrónicamente cuando llame a Sayshello ()
clase pública A {public void sayshello () {sayhi (); } @Async public void sayshi () {}}1.3. @Async anotación
Agregar anotación @async al método significa que esta es una llamada asincrónica. En otras palabras, la persona que llama del método obtendrá la devolución de inmediato, y la ejecución del método real es enviar una tarea en el Taskexecutor de Spring.
En otras palabras, la persona que llama volverá inmediatamente tras la invocación y la ejecución real del método ocurrirá en una tarea que se ha enviado a un taskexecutor de primavera.
@Asyncvoid dosomething () {// Esto se ejecutará asincrónicamente} @Asyncvoid dosomething (string s) {// Esto se ejecutará asíncronamente} @Asyncfuture <string> returnomething (int i) {// Esto se ejecutará asíncronamente}Aviso:
Los métodos de @Async no solo pueden declarar un java.util.concurrent.cuture tipo de retorno, sino también el org.springframework.util.concurrent.listenablefuture de Spring o, a partir de la primavera 4.2, java.util.concurrent de JDK 8.
1.4. @Async Executor Limited
Por defecto, cuando se agrega la anotación de @Async al método, se utilizará un ejecutor que admite el controlador de anotación. Sin embargo, el valor de valor de la anotación @Async puede especificar un ejecutor adicional
@Async ("OtherExecutor") void dosomething (String s) {// Esto será ejecutado asincrónicamente por "Otherexecutor"}Aquí, Otherexecutor es el nombre de cualquier frijol del ejecutor en el contenedor de primavera.
1.5. @Async Gestión de excepciones
Cuando un método @Async tiene un valor de retorno del tipo futuro, es fácil administrar la excepción realizada al escribir el método get () de Future para obtener el resultado de ejecución de la tarea. Si el tipo de retorno es nulo, entonces la excepción no será atrapada.
clase pública myAsyncUncUncExceptionHandler implementa asyncunceughedExceptionHandler {@Override Void HandleUnnwageughException (Throwable EX, Método, Método, Objeto ... Params) {// Manejo de excepción}} 2. Configuración del grupo de subprocesos
importar org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; import org.springframework.scheduling.annotation.eableasync; import org.springingwork.scheduling.concurrent.threadpooltaskexecutor; clase TaskExecutorconfig {privado entero corepoolSize = 30; Integer privado maxpoolSize = 50; Integer privado KeepAliveSeconds = 300; // Private Integer QueueCapacity = 2000; @Bean ("myThreadPoolTaskExecutor") public threadpoolTaskExecutor myThreadPoolTaskExecutor () {ThreadPoolTASKEXECUTOR Ejecutor = new ThreadPoolTASKEXECUTOR (); ejecutor.setCorepoolSize (corePoolSize); ejecutor.setMaxPoolSize (maxpoolSize); Ejecutor.setkeepaliveSeconds (KeepAliveSeconds); // Ejecutor.setqueueCapacity (QueueCapacity); Ejecutor.SetWaitFortAkStocompleteonShutdown (verdadero); ejecutor.initialize (); devolver ejecutor; }} Llamar
@Async ("myThreadPoolTaskExecutor") @Override public void presente (CouponPresentLogEntity Entity) {try {cuponBaseResponse rst = cuponsEndrpcservice.send (entity.getUserId (), entity.getCouponBatchKey (), "1", entity.getvendorId ());););); if (null! = rst && rst.issuccess ()) {entity.setStatus (presenteStatusenum.success.gettype ()); } else {string razonal = (null == rst)? "Excepción de respuesta": rst.getMsg (); entity.setFailureRason (razón); entity.setStatus (presenteStatusenum.Failure.gettype ()); }} catch (excepción ex) {log.error (ex.getMessage (), ex); entity.setFailureRason (Ex.getMessage ()); entity.setStatus (presenteStatusenum.Failure.gettype ()); } CouponPresentLogdao.Update (entidad); }resultado
[Info] 2018-05-09 16: 27: 39.887 [myThreadPoolTaskExecutor-1] [com.ourhours.coupon.rpc.dubbo.receivelogfilter]-Recibir el método: enviar; Argumentos: [10046031, "4D7CC32F8F7E4B00BCA56F6BF4B3B658", "1", 10001]
[Info] 2018-05-09 16: 27: 39.889 [myThreadPoolTaskExecutor-2] [com.ourhours.coupon.rpc.dubbo.receivelogfilter]-Recibir el método: enviar; Argumentos: [10046031, "4D7CC32F8F7E4B00BCA56F6BF4B3B658", "1", 10001]
referirse a:
Spring Framework Reference Documentation 4.3.17.libia
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.