Prefacio
Este artículo presenta principalmente el contenido relevante sobre la llamada asíncrona de la integración de arranque de Spring a Async. Se comparte para su referencia y aprendizaje. No diré mucho a continuación, echemos un vistazo a la introducción detallada juntos.
¿Qué es una llamada asíncrona?
Las llamadas asincrónicas son relativas a las llamadas sincrónicas. Las llamadas sincrónicas se refieren al programa que se ejecuta paso a paso en un orden predeterminado. Cada paso debe ejecutarse hasta que se ejecute el paso anterior. Las llamadas asíncronas no necesitan esperar a que se ejecute el programa anterior.
Método de procesamiento asincrónico
¿Cómo implementar llamadas asíncronas?
Multithreading es una palabra clave que muchas personas piensan al principio. Sí, Multithreading es una forma de implementar llamadas asincrónicas.
En proyectos que no son de primavera, queremos implementar llamadas asíncronas que usen métodos de múltiples subprocesos, podemos implementar la interfaz ejecutable nosotros mismos o integrar la clase de subprocesos, o usar el grupo de subprocesos de ejecutores proporcionado por JDK1.5 o superior.
Strngboot ofrece una forma muy conveniente de ejecutar llamadas asíncronas.
Sigue el ejemplo oficial
Ingrese el código
Maven Dependencias:
<Parent> <MoupRoD> org.springframework.boot </proupid> <artifactid> spring-boot-starter-parent </arfactid> <version> 1.5.3.release </verversion> </parent> <pendencies> <ependency> <grupo> org.springfamework.boot </groupid> <artifactid> spring-starter-starter-webeb-webeb </artharter> </pendency> </dependencias>
Inicie la clase: Agregar anotación @enableasync
@SpringBootApplication @EnableAsync Public Class Application {public static void main (string [] args) {springApplication.run (application.class, args); }}Controlador
Simplemente agregue la anotación de @async en el método que necesita para ejecutar asíncronamente
@RestController @RequestMapping ("") clase pública AsyncTaskController {@RequestMapping ("") public String dotask () lanza interruptedException {Long CurrentTentTrimillis = System.CurrentTimillis (); this.task1 (); this.task2 (); this.task3 (); Long CurrentTimemillis1 = System.CurrentTimemillis (); return "Tarea Tarea Tiempo total consumido:"+(CurrentTimemillis1-CurrentTimemillis)+"MS"; } @Async public void tarea1 () lanza interruptedException {long currentTimemillis = system.currentTimemillis (); Thread.sleep (1000); Long CurrentTimemillis1 = System.CurrentTimemillis (); System.out.println ("Tarea1 Tarea Tiempo consumido:"+(CurrentTimemillis1-CurrentTimemillis)+"MS"); } @Async public void tarea2 () lanza interruptedException {long currentTimemillis = system.currentTimemillis (); Thread.sleep (2000); Long CurrentTimemillis1 = System.CurrentTimemillis (); System.out.println ("Tarea2 Tarea Consumir el tiempo:"+(CurrentTimemillis1-CurrentTimemillis)+"MS"); } @Async public void tarea3 () lanza interruptedException {long currentTimemillis = system.currentTimemillis (); Thread.sleep (3000); Long CurrentTimemillis1 = System.CurrentTimemillis (); System.out.println ("Tarea3 Tarea Consumir el tiempo:"+(CurrentTimemillis1-CurrentTimemillis)+"MS"); }}La función principal ejecuta el proyecto Spirngboot. Después de completar el inicio, el navegador accede a: http: // localhost: 8080/
Consola:
Tarea1 Tiempo de la tarea: 1012ms Tarea2 Tiempo de tarea: 2009ms Tarea3 Tiempo de tarea: 3004ms
Después de esperar un tiempo, se ingresa la salida:
Tiempo de tarea total: 6002 ms
Asíncronamente, no se ejecuta!
¿Podría ser que el código se escriba incorrectamente? Lo revisé varias veces y no encontré errores obvios. Recuerdo que Spring también tuvo problemas similares con la anotación @Transactional. Cuando Spring escanea una clase con el método de anotación @Transactional, se genera una clase de proxy y la clase proxy comienza y cierra la transacción. En la misma clase, la llamada del método se ejecuta en el cuerpo de la clase, y Spring no puede interceptar esta llamada de método.
De repente, coloque la tarea asincrónica en una clase por separado y ajuste el código para ingresar:
Controlador
@RequestMapping ("") @RestController Public Class AsyncTaskController {@autewired private asynctask asyncTask; @RequestMapping ("") public String dotask () lanza interruptedException {Long CurrentTimemillis = System.CurrentTimemillis (); asynctask.task1 (); asynctask.task2 (); asynctask.task3 (); Long CurrentTimemillis1 = System.CurrentTimemillis (); return "tarea tarea total consumo de tiempo:"+(CurrentTimemillis1-CurrentTimemillis)+"MS"; }} Clase de tareas asincrónicas
@Component public class AsyncTask {@Async public void task1 () lanza interruptedException {long currentTimemillis = system.currentTimemillis (); Thread.sleep (1000); Long CurrentTimemillis1 = System.CurrentTimemillis (); System.out.println ("Tarea1 Tarea Consumir el tiempo:"+(CurrentTimemillis1-CurrentTimemillis)+"MS"); } @Async public void tarea2 () lanza interruptedException {long currentTimemillis = system.currentTimemillis (); Thread.sleep (2000); Long CurrentTimemillis1 = System.CurrentTimemillis (); System.out.println ("Tarea2 Tarea Consumir el tiempo:"+(CurrentTimemillis1-CurrentTimemillis)+"MS"); } @Async public void tarea3 () lanza interruptedException {long currentTimemillis = system.currentTimemillis (); Thread.sleep (3000); Long CurrentTimemillis1 = System.CurrentTimemillis (); System.out.println ("Tarea3 Tarea Consumir el tiempo:"+(CurrentTimemillis1-CurrentTimemillis)+"MS"); }}Consola:
Tarea1 Tiempo de la tarea: 1012ms Tarea2 Tiempo de tarea: 2009ms Tarea3 Tiempo de tarea: 3004ms
Ingrese los resultados del navegador:
Tiempo de tarea total: 19ms
¡La llamada asíncrona tuvo éxito!
¿Cómo saber cuándo se ejecutan las tres tareas asíncronas y cuáles son los resultados de la ejecución? Puede usar el método para agregar una devolución de llamada de Faature para juzgar
Se ingresa el código:
Clase de tareas asincrónicas
@Component public class AsyncTask {@Async public Future <String> task1 () lanza interruptedException {long currenttimeMillis = system.currentTimemillis (); Thread.sleep (1000); Long CurrentTimemillis1 = System.CurrentTimemillis (); System.out.println ("Tarea1 Tarea Consumir el tiempo:"+(CurrentTimemillis1-CurrentTimemillis)+"MS"); devolver nuevo Asyncresult <String> ("La ejecución de la tarea1 está completa"); } @Async public Future <String> task2 () lanza interruptedException {Long CurrentTimemillis = System.CurrentTimemillis (); Thread.sleep (2000); Long CurrentTimemillis1 = System.CurrentTimemillis (); System.out.println ("Tarea2 Tarea Consumir el tiempo:"+(CurrentTimemillis1-CurrentTimemillis)+"MS"); devolver nuevo Asyncresult <String> ("Se completa la ejecución de la tarea2"); } @Async public Future <String> task3 () lanza interruptedException {Long CurrentTimemillis = System.CurrentTimemillis (); Thread.sleep (3000); Long CurrentTimemillis1 = System.CurrentTimemillis (); System.out.println ("Tarea3 Tarea Consumir el tiempo:"+(CurrentTimemillis1-CurrentTimemillis)+"MS"); devolver nuevo asyncresult <string> ("Tark3 Ejecución completada"); }} Controlador
@RequestMapping ("") @RestController Public Class AsyncTaskController {@autewired private asynctask asyncTask; @RequestMapping ("") public String dotask () lanza interruptedException {Long CurrentTimemillis = System.CurrentTimemillis (); Futuro <String> tarea1 = asynctask.task1 (); Futuro <String> task2 = asyncTask.task2 (); Futuro <String> tarea3 = asyncTask.task3 (); Resultado de cadena = nulo; for (;;) {if (task1.isdone () && task2.isdone () && task3.isdone ()) {// Las tres tareas están llamadas a completar, salir del bucle y esperar el descanso; } Thread.sleep (1000); } Long CurrentTimemillis1 = System.CurrentTimemillis (); resultado = "Total-Time-Consumen de tareas:"+(CurrentTimemillis1-CurrentTimemillis)+"MS"; resultado de retorno; }}Salida de la consola:
Tarea1 Tiempo de la tarea: 1000ms Tarea de tarea Tiempo: 2001ms Tarea3 Tiempo de tarea: 3001ms
Salida del navegador:
Tiempo de tarea total: 4015 ms
¡La llamada asíncrona es exitosa y el programa devuelve el resultado solo cuando todas las tareas se completan!
Resumir
Lo anterior es todo el contenido de este artículo. Espero que el contenido de este artículo tenga cierto valor de referencia para el estudio o el trabajo de todos. Si tiene alguna pregunta, puede dejar un mensaje para comunicarse. Gracias por su apoyo a Wulin.com.