Spring 주해@Async 를 깊이 이해 하여 비동기 호출 문 제 를 해결 합 니 다.

머리말:Spring 중@Async
Spring 문서 설명 에 따 르 면 기본적으로 단일 스 레 드 모드 를 사용 합 니 다.그래서 자바 응용 에서 절대 다수의 상황 에서 동기 화 방식 을 통 해 상호작용 처 리 를 실현 한다.
그러면 여러 임무 의 집행 이 반드시 서로 영향 을 줄 것 이다.예 를 들 어 A 임 무 를 오래 수행 하면 B 임 무 는 A 임 무 를 수행 한 후에 야 실행 을 시작 할 수 있다.또한 제3자 시스템 과 의 상호작용 을 처리 할 때 응답 이 느 린 상황 을 초래 하기 쉽다.그 전에 대부분 다 중 스 레 드 를 사용 하여 이런 임 무 를 완성 했다.사실은 spring 3.x 이후 에@Async 를 내장 하여 이 문 제 를 완벽 하 게 해결 했다.
1.비동기 호출 은 무엇 입 니까?
설명 하기 전에 우 리 는 먼저 두 사람의 정 의 를 살 펴 보 자.
동기 호출:순서 실행,이전 작업 이 끝 날 때 까지 기 다 려 야 합 니 다.
전체 처리 과정 이 순서대로 실행 되 고 각 과정 이 완료 되면 결 과 를 되 돌려 주 는 것 이다.
비동기 호출:명령 을 받 으 면 실행 합 니 다.기다 릴 필요 가 없습니다.
호출 명령 만 보 냈 을 뿐 호출 자 는 호출 된 방법 이 완전히 실 행 될 때 까지 기다 릴 필요 가 없다.다음 절 차 를 계속 수행 하 는 것 이다.
예 를 들 어 특정한 호출 에서 A,B,C 세 가지 과정 방법 을 순서대로 호출 해 야 한다.
만약 에 그들 이 모두 동기 호출 이 라면 그들 을 모두 순서대로 집행 한 후에 야 과정 이 완 료 된 것 이 라 고 할 수 있다.만약 에 B 가 비동기 적 인 호출 방법 이 라면 A 를 실행 한 후에 B 를 호출 하면 B 가 완성 되 기 를 기다 리 지 않 고 C 를 호출 하기 시작 합 니 다.C 가 실 행 된 후에 이 과정 이 실 행 된 것 을 의미 합 니 다.
그림 에서 보 듯 이:

2.일반적인 비동기 호출 처리 방식
자바 에 서 는 일반적으로 유사 한 장면 을 처리 할 때 독립 된 스 레 드 를 만들어 서 해당 하 는 비동기 호출 논 리 를 완성 합 니 다.메 인 스 레 드 와 서로 다른 스 레 드 간 의 실행 절 차 를 통 해 독립 된 스 레 드 를 시작 한 후에 메 인 스 레 드 는 계속 실행 되 고 정체 되 지 않 고 기다 리 는 상황 이 발생 하지 않 습 니 다.또는 TaskExecutor 를 사용 하여 비동기 스 레 드 를 실행 합 니 다.참조https://www.jb51.net/article/191512.htm
3.Spring 에서@Async 를 어떻게 사용 합 니까?
3.0,@Async 소개
Spring 에서@Async 레이 블 을 기반 으로 하 는 방법 을 비동기 방법 이 라 고 합 니 다.이 방법 들 은 실 행 될 때 독립 된 스 레 드 에서 실 행 됩 니 다.호출 자 는 완 료 를 기다 리 지 않 고 다른 작업 을 계속 할 수 있 습 니 다.
3.1,@Async 주석 사용
3.1.1 자바 설정 기반 사용 방식

@Configuration 
@EnableAsync 
public class SpringAsyncConfig { ... } 
3.1.2 SpringBoot 설정 을 기반 으로 하 는 사용 방식

@SpringBootApplication
@EnableAsync
public class SpringBootApplication {
 public static void main(String[] args) {
 SpringApplication.run(SpringBootApplication.class, args);
 }
}
3.2@Async 주 해 를 사용 하고 성명 방법 은 비동기 호출 입 니 다.
3.2.0、반환 값 이 없 는 방법 에서 사용:
방법 에 있어 서 비동기 호출 방법 으로 명시 하면 된다.

 @Async //    
 public void downloadFile() throws Exception { ... } 
3.2.1 반환 값 방법 에 사용

@Async 
public Future<String> asyncMethodWithReturnType() { 
 System.out.println("Execute method asynchronously - " + Thread.currentThread().getName()); 
 try { 
 Thread.sleep(5000); 
 return new AsyncResult<String>("hello world !!!!"); 
 } catch (InterruptedException e) { 
 // 
 } 
 
 return null; 
}
상기 예제 에서 알 수 있 듯 이 되 돌아 오 는 데이터 형식 은 Future 형식 이 고 인터페이스 입 니 다.구체 적 인 결과 유형 은 AsyncResult 입 니 다.주의해 야 할 부분 입 니 다.
결 과 를 되 돌려 주 는 비동기 방법 예제:

public void testAsyncAnnotationForMethodsWithReturnType() 
 throws InterruptedException, ExecutionException { 
 System.out.println("Invoking an asynchronous method. " + Thread.currentThread().getName()); 
 Future<String> future = asyncAnnotationExample.asyncMethodWithReturnType(); 
 
 while (true) { ///         ,         
 if (future.isDone()) { //         
 System.out.println("Result from asynchronous process - " + future.get()); 
 break; 
 } 
 System.out.println("Continue doing something else. "); 
 Thread.sleep(1000); 
 } 
}
비동기 방법의 결과 정 보 를 얻 는 것 은 Future 의 상 태 를 끊임없이 검사 함으로써 현재 의 비동기 방법 이 실행 되 었 는 지 여 부 를 얻 는 것 입 니 다.
4.@Async 호출 에 따 른 이상 처리 메커니즘
비동기 방법 에서 이상 이 발생 하면 호출 자 콜 러 에 게 감지 할 수 없습니다.이상 처리 가 필요 하 다 면 다음 과 같은 방법 으로 처리 합 니 다.
AsyncTaskExecutor 를 위 한 작업 실행 기 사용자 정의
구체 적 인 이상 을 처리 하 는 논리 와 방식 을 정의 합 니 다.
내 장 된 작업 실행 기 대신 사용자 정의 TaskExecutor 설정
예제 1,사용자 정의 TaskExecutor

public class ExceptionHandlingAsyncTaskExecutor implements AsyncTaskExecutor { 
 private AsyncTaskExecutor executor; 
 public ExceptionHandlingAsyncTaskExecutor(AsyncTaskExecutor executor) { 
 this.executor = executor; 
 } 
 ////         ,@Async        
 public void execute(Runnable task) { 
 executor.execute(createWrappedRunnable(task)); 
 } 
 public void execute(Runnable task, long startTimeout) { 
 /         ,@Async        
 executor.execute(createWrappedRunnable(task), startTimeout); 
 } 
 public Future submit(Runnable task) { return executor.submit(createWrappedRunnable(task)); 
 //         ,@Async       。 
 } 
 public Future submit(final Callable task) { 
 //         ,@Async       。 
 return executor.submit(createCallable(task)); 
 } 
 
 private Callable createCallable(final Callable task) { 
 return new Callable() { 
 public T call() throws Exception { 
  try { 
  return task.call(); 
  } catch (Exception ex) { 
  handle(ex); 
  throw ex; 
  } 
  } 
 }; 
 } 
 
 private Runnable createWrappedRunnable(final Runnable task) { 
 return new Runnable() { 
 public void run() { 
  try { 
  task.run(); 
  } catch (Exception ex) { 
  handle(ex); 
  } 
 } 
 }; 
 } 
 private void handle(Exception ex) { 
 //             
 System.err.println("Error during @Async execution: " + ex); 
 } 
}
분석:AsyncTaskExecutor 를 실현 하고 독립 된 스 레 드 로 구체 적 인 모든 방법 을 수행 한 것 으로 나 타 났 다.createCallable 과 createWrapper Runnable 에서 이상 한 처리 방식 과 메커니즘 을 정의 합 니 다.
handle()은 미래 에 우리 가 관심 을 가 져 야 할 이상 처리 부분 이다.
xml 프로필 의 내용:

<task:annotation-driven executor="exceptionHandlingTaskExecutor" scheduler="defaultTaskScheduler" /> 
<bean id="exceptionHandlingTaskExecutor" class="nl.jborsje.blog.examples.ExceptionHandlingAsyncTaskExecutor"> 
 <constructor-arg ref="defaultTaskExecutor" /> 
</bean> 
<task:executor id="defaultTaskExecutor" pool-size="5" /> 
<task:scheduler id="defaultTaskScheduler" pool-size="1" />
주석 형식 으로 설정 을 bean 에 등록 할 수도 있 습 니 다.
5.@Async 호출 중인 트 랜 잭 션 처리 메커니즘
@Async 에 표시 하 는 방법 과 함께@Transactional 로 표시 합 니 다.데이터 베 이 스 를 호출 할 때 사무 관리 에 대한 통 제 를 할 수 없 는 이 유 는 비동기 처 리 를 바탕 으로 하 는 작업 이기 때문이다.
그러면 어떻게 이 조작 들 에 사무 관 리 를 추가 해 야 합 니까?
트 랜 잭 션 관리 작업 이 필요 한 방법 을 비동기 방법 내부 에 배치 하고 내부 호출 방법 에@Transactional 을 추가 할 수 있 습 니 다.
예시:
방법 A,@Async/@Transactional 로 표 시 했 지만 사무 통제 의 목적 이 생 길 수 없습니다.
방법 B,@Async 로 표 시 했 습 니 다.B 에서 C,D,C/D 를 각각@Transactional 로 표 시 했 으 면 사무 통제 의 목적 을 실현 할 수 있 습 니 다.
6.참고 문장:
[1]、 https://www.jb51.net/article/109345.htm
[2]、 https://www.jb51.net/article/191512.htm
Spring 주해@Async 를 깊이 이해 하여 비동기 호출 문 제 를 해결 하 는 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 Spring 주해@Async 가 비동기 호출 내용 을 해결 하 는 것 에 대해 서 는 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 저 를 많이 응원 해 주세요!

좋은 웹페이지 즐겨찾기