머리말
이 기사는 주로 Spring Boot Integration의 비동기 호출에 대한 관련 내용을 Async에 소개합니다. 참조와 학습을 위해 공유됩니다. 나는 아래에서 많이 말하지 않을 것입니다. 자세한 소개를 함께 살펴 보겠습니다.
비동기 호출은 무엇입니까?
비동기 호출은 동기 호출과 관련이 있습니다. 동기 통화는 프로그램이 미리 정해진 순서로 단계별로 실행되는 것을 나타냅니다. 각 단계는 이전 단계가 실행될 때까지 실행해야합니다. 비동기 통화는 이전 프로그램이 실행될 때까지 기다릴 필요가 없습니다.
비동기 처리 방법
비동기 통화를 구현하는 방법은 무엇입니까?
멀티 스레딩은 처음에 많은 사람들이 생각하는 키워드입니다. 예, 멀티 스레딩은 비동기 호출을 구현하는 방법입니다.
비 홍조 프로젝트에서 비동기 호출은 다중 스레딩 메소드를 사용하거나 실행 가능한 인터페이스를 직접 구현하거나 스레드 클래스를 통합하거나 JDK1.5 이상에서 제공 한 Executors 스레드 풀을 사용할 수 있습니다.
strngboot는 비동기 호출을 실행하는 매우 편리한 방법을 제공합니다.
공식적인 예를 따르십시오
코드를 입력하십시오
Maven 의존성 :
<부모> <groupid> org.springframework.boot </groupid> <artifactid> Spring-boot-starter-parent </artifactid> <bersion> 1.5.3.3.3.3.30 </version> </parent> <pexendency> <groupId> org.springframework.boot </groupId> <artifactid> spring-starter-web </artifactid </종속성> </종속성>
수업 시작 : @enableasync 주석을 추가하십시오
@SpringBootApplication @enableAsync public class 응용 프로그램 {public static void main (String [] args) {springApplication.run (application.class, args); }}제어 장치
비동기 적으로 실행하는 데 필요한 메소드에 @async 주석을 추가하십시오.
@RestController @RequestMapping ( "") 공개 클래스 asynctaskController {@requestmapping ( "") public String dotask () 중간 누락 {long currentTimEmillis = System.CurrentTimeMillis (); this.task1 (); this.task2 (); this.task3 (); Long CurrentTimeMillis1 = System.CurrentTimeMillis (); "작업 작업 총 소비 시간 :"+(CurrentTimEmillis1-CurrentTimEmillis)+"MS"; } @Async public void task1 ()는 interruptedException {long currentTimEmillis = system.currentTimeMillis (); Thread.sleep (1000); Long CurrentTimeMillis1 = System.CurrentTimeMillis (); System.out.println ( "작업 1 작업 시간 소비 시간 :"+(CurrentTimEmillis1-CurrentTimeMillis)+"MS"); } @Async public void task2 ()는 interruptedException {long currentTimEmillis = system.currentTimeMillis (); Thread.sleep (2000); Long CurrentTimeMillis1 = System.CurrentTimeMillis (); System.out.println ( "Task2 Task Time-Consoring :"+(currentTimEmillis1-CurrentTimeMillis)+"MS"); } @Async public void task3 ()는 interruptedException {long currentTimEmillis = system.currentTimeMillis (); Thread.sleep (3000); Long CurrentTimeMillis1 = System.CurrentTimeMillis (); System.out.println ( "task3 task 시간 소모 :"+(currentTimEmillis1-currenttimEmillis)+"ms"); }}기본 기능은 Spirngboot 프로젝트를 실행합니다. 시작이 완료된 후 브라우저가 액세스됩니다 : http : // localhost : 8080/
콘솔:
Task1 Task Time : 1012ms Task2 작업 시간 : 2009ms Task3 Task Time : 3004ms
잠시 기다린 후 출력이 입력됩니다.
총 작업 시간 : 6002ms
비동기 적으로 실행되지 않았습니다!
코드가 잘못 작성되었을 수 있습니까? 나는 그것을 여러 번 확인했고 명백한 오류를 찾지 못했습니다. 봄도 @transactional 주석과 비슷한 문제가 있음을 기억합니다. 스프링이 @Transactional Annotation 메소드로 클래스를 스캔하면 프록시 클래스가 생성되고 프록시 클래스가 시작하여 트랜잭션을 닫습니다. 같은 클래스에서 메소드 호출은 클래스 본문에서 실행되며 Spring 은이 메소드 호출을 가로 채울 수 없습니다.
갑자기 비동기 작업을 클래스에 별도로 넣고 코드를 조정하여 다음을 입력 할 수 있습니다.
제어 장치
@requestmapping ( "") @RestController public class asynctaskController {@autowired private asynctask asynctask; @RequestMapping ( "") public String dotask ()는 InterruptedException {long currentTimeMillis = System.CurrentTimeMillis (); asynctask.task1 (); asynctask.task2 (); asynctask.task3 (); Long CurrentTimeMillis1 = System.CurrentTimeMillis (); "작업 작업 총 시간 소모 :"+(CurrentTimEmillis1-CurrentTimEmillis)+"MS"; }} 비동기 작업 클래스
@component public class asynctask {@async public void task1 () throws interruptedException {long currentTimEmillis = system.currentTimeMillis (); Thread.sleep (1000); Long CurrentTimeMillis1 = System.CurrentTimeMillis (); System.out.println ( "task1 task 시간 소요 :"+(currentTimEmillis1-currenttimeMillis)+"ms"); } @Async public void task2 ()는 interruptedException {long currentTimEmillis = system.currentTimeMillis (); Thread.sleep (2000); Long CurrentTimeMillis1 = System.CurrentTimeMillis (); System.out.println ( "Task2 Task Time-Consoring :"+(currentTimEmillis1-CurrentTimeMillis)+"MS"); } @Async public void task3 ()는 interruptedException {long currentTimEmillis = system.currentTimeMillis (); Thread.sleep (3000); Long CurrentTimeMillis1 = System.CurrentTimeMillis (); System.out.println ( "task3 task 시간 소모 :"+(currentTimEmillis1-currenttimEmillis)+"ms"); }}콘솔:
Task1 Task Time : 1012ms Task2 작업 시간 : 2009ms Task3 Task Time : 3004ms
브라우저 결과를 입력하십시오.
총 작업 시간 : 19ms
비동기 통화가 성공했습니다!
세 가지 비동기 작업이 언제 실행되는지 어떻게 알 수 있으며 실행 결과는 무엇입니까? 판단하기 위해 faugate 콜백을 추가하는 방법을 사용할 수 있습니다.
코드가 입력됩니다.
비동기 작업 클래스
@component public class asynctask {@async public future <string> task1 () throws interruptedException {long currentTimEmillis = system.currentTimeMillis (); Thread.sleep (1000); Long CurrentTimeMillis1 = System.CurrentTimeMillis (); System.out.println ( "task1 task 시간 소요 :"+(currentTimEmillis1-currenttimeMillis)+"ms"); 새로운 Asyncresult <string>을 반환합니다 ( "task1 execution이 완료되었습니다"); } @Async public future <string> task2 ()는 InterruptedException {long currentTimEmillis = system.currentTimeMillis (); Thread.sleep (2000); Long CurrentTimeMillis1 = System.CurrentTimeMillis (); System.out.println ( "Task2 Task Time-Consoring :"+(currentTimEmillis1-CurrentTimeMillis)+"MS"); 새로운 asyncresult <string>을 반환합니다 ( "task2 execution이 완료되었습니다"); } @Async public future <string> task3 ()는 InterruptedException을 던지 었습니다. Thread.sleep (3000); Long CurrentTimeMillis1 = System.CurrentTimeMillis (); System.out.println ( "task3 task 시간 소모 :"+(currentTimEmillis1-currenttimEmillis)+"ms"); 새로운 Asyncresult <string> ( "Task3 Execution 완료")을 반환합니다. }} 제어 장치
@requestmapping ( "") @RestController public class asynctaskController {@autowired private asynctask asynctask; @RequestMapping ( "") public String dotask ()는 InterruptedException {long currentTimeMillis = System.CurrentTimeMillis (); Future <string> task1 = asynctask.task1 (); 미래의 <string> task2 = asynctask.task2 (); 미래의 <string> task3 = asynctask.task3 (); 문자열 결과 = null; for (;;) {if (task1.isdone () && task2.isdone () && task3.isdone ()) {// 세 가지 작업이 모두 완료되어 루프를 종료하고 휴식을 기다리십시오. } thread.sleep (1000); } long currentTimeMillis1 = System.CurrentTimeMillis (); 결과 = "작업의 총 시간 소모 반환 결과; }}콘솔 출력 :
작업 1 작업 시간 : 1000ms 작업 2 작업 시간 : 2001ms Task3 작업 시간 : 3001ms
브라우저 출력 :
총 작업 시간 : 4015ms
비동기 호출이 성공적이며 프로그램은 모든 작업이 완료 될 때만 결과를 반환합니다!
요약
위는이 기사의 전체 내용입니다. 이 기사의 내용에 모든 사람의 연구 나 작업에 대한 특정 참조 가치가 있기를 바랍니다. 궁금한 점이 있으면 의사 소통을 위해 메시지를 남길 수 있습니다. Wulin.com을 지원 해주셔서 감사합니다.