Spring 주해@Async 를 깊이 이해 하여 비동기 호출 문 제 를 해결 합 니 다.
7300 단어 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 가 비동기 호출 내용 을 해결 하 는 것 에 대해 서 는 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 저 를 많이 응원 해 주세요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.