marco resorte Área - @Transactional o @Async señala Análisis de Falla

  
  Recientemente sintiendo un montón de amigos para explorar este tema, a fin de poner este artículo en el blog antes de que el número enviado al público. De hecho,  @Transactional  oa  @Async  causa de fallo de anotación es simple: sus principios son agentes dinámicos, lo que significa que sólo a través de una clase de proxy para llamar al método para poder realizar el método de efecto de "mejora". Aquí para  @Async  ejemplo.

  La siguiente definición de un  Service: ejecución de dos método asincrónico  test03() y  test02() utilizado para simular el proyecto que puede ocurrir en una operación que consume tiempo, entonces  test() la llamada al método dos métodos que requieren mucho tiempo:

definiciones  Controller:

 

 

método de ejecución que devuelve el resultado:

 

 

  El método de los resultados de ejecución claramente incompatible con nuestras expectativas, enfoque secuencial de salida expresados  test02() y  test03() dos método asincrónico realmente ejecutado de forma sincrónica, y que está  @Aysnc anotado ineficaz!

  El motivo del error se debe a que estamos en un  test() proceso llamado directamente  test02() y  test03() método, el equivalente  this.test02() , y  this.test03() las llamadas, que realmente llama  test02() y  test03() método para  TestService el objeto en sí, mientras que las llamadas  @Async y  @Transactional anotada usando la naturaleza dinámica del agente, en realidad debería ser  TestService el llamar al objeto proxy  método. De hecho, la clase de objeto contenedor de primavera inicializado cuando el contenedor primavera contendrá anotaciones AOP "reemplazan" objetos proxy (tan fácil de entender), entonces la razón del fracaso de notas es bastante claro, que se debe a que es el objeto en sí mismo en lugar de la llamada al método de proxy objeto, porque no hay ningún contenedor de primavera, a continuación, la solución será a lo largo de esta línea de pensamiento para resolver. test02()  test03() 

  Hay muchos blog en línea dice que la solución va a ser ejecutado de forma asíncrona dibujado de forma individual en una clase, por lo que tampoco puede resolver el problema de la falta de anotación asíncrono, el principio es que cuando se pone el método para llevar a cabo la extracción asíncrona solo como una clase, esta clase es, sin duda la primavera está siendo administrado, cuando se necesita llamar a otros componentes de la primavera será sin duda inyectar en ella, cuando en realidad se inyecta en la clase de proxy, pero en realidad hay otras soluciones, no tiene que dibujado de forma individual en una clase.

Una solución: Obtener su propio objeto proxy de contexto a la llamada a través de un método asincrónico en TestService

De hecho, somos la inyección objetivo asignación variable miembro desde el contenedor del resorte a los componentes del resorte actuales, debido a la  TestService utilización de anotaciones AOP, entonces, de hecho  TestService existen realmente en el recipiente del resorte es su objeto proxy.

(Herramientas de referencia pueden ser:

https://blog.csdn.net/Dongguabai/article/details/80788646)

Los resultados del método asíncrono de ejecución asíncrono:

Resolver manera: CGLIB proxy abierto, la clase de proxy manualmente llegar la primavera

En la primavera de arranque de inicio de clases más:

Uso  AopContext.currentProxy() Obtener la clase de proxy actual:

Para demostrar este tema contenedor de primavera es especialmente salida frase objeto de clase de agente actual:

El resultado:

OK, la solución del problema perfecta!

 

Supongo que te gusta

Origin www.cnblogs.com/liboware/p/12469245.html
Recomendado
Clasificación