[SPRING] Spring에서 @Async 호출이 완료되었는지 확인하는 방법은 무엇입니까?
SPRINGSpring에서 @Async 호출이 완료되었는지 확인하는 방법은 무엇입니까?
rsync 명령을 실행하는 메소드에 @Async 주석을 사용합니다. 한 번에이 메소드를 호출하는 10 개의 스레드가 있습니다. 필자의 요구 사항은 10 개의 모든 스레드가 rsync 명령을 완료 한 후 나머지 코드 만 실행해야하지만 10 개의 모든 스레드가 @Async 메서드를 완전히 실행했는지 여부를 확인하지 못합니다. 그래서 그것을 확인하는 방법을 말해주십시오.
해결법
-
==============================
1.값을 반환하려면 표준 값 Java SE Future 또는 Spring의 AsyncResult에 반환 값을 래핑해야합니다.이 값은 Future도 구현합니다.
값을 반환하려면 표준 값 Java SE Future 또는 Spring의 AsyncResult에 반환 값을 래핑해야합니다.이 값은 Future도 구현합니다.
이 같은:
@Component class AsyncTask { @Async public Future<String> call() throws InterruptedException { return new AsyncResult<String>("return value"); } }
호출자에서이 작업을 수행하면 다음과 같은 작업을 수행 할 수 있습니다.
public void kickOffAsyncTask() throws InterruptedException { Future<String> futureResult = asyncTask.call(); //do some stuff in parallel String result = futureResult.get(); System.out.println(result); }
futureResult.get () 호출은 호출자 스레드를 차단하고 비동기 스레드가 완료 될 때까지 대기합니다.
선택 사항으로 영원히 기다리지 않으려면 Future.get (long timeout, TimeUnit unit)을 사용할 수 있습니다.
편집하다:
어떤 값을 반환 할 필요가 없다면 여전히 더미 반환 값을 반환하는 것이 좋습니다. 특별한 스레드를 완료했음을 나타 내기 위해 아무 것도 사용하지 않아도됩니다. 이 같은:
public void kickOffAsyncTasks(int execCount) throws InterruptedException { Collection<Future<String>> results = new ArrayList<>(execCount); //kick off all threads for (int idx = 0; idx < execCount; idx++) { results.add(asyncTask.call()); } // wait for all threads results.forEach(result -> { try { result.get(); } catch (InterruptedException | ExecutionException e) { //handle thread error } }); //all threads finished }
-
==============================
2.이 작업을 완료 한 후 코드를 완료하려면 @Async를 사용하면 안됩니다. 어떤 이유로 비동기 적으로 호출하면이 메서드에서 Future를 반환하고 값이 반환 될 때까지 기다려야합니다.
이 작업을 완료 한 후 코드를 완료하려면 @Async를 사용하면 안됩니다. 어떤 이유로 비동기 적으로 호출하면이 메서드에서 Future를 반환하고 값이 반환 될 때까지 기다려야합니다.
from https://stackoverflow.com/questions/29181057/how-to-check-that-async-call-completed-in-spring by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] OAuth2.0 - 프론트 엔드와 백엔드가 다른 서버에서 실행되는 GitHub를 사용한 인증. CORS 오류 (0) | 2019.07.13 |
---|---|
[SPRING] 컨트롤러없이 잭슨으로 객체를 만들 때 유효합니다. (0) | 2019.07.13 |
[SPRING] 스프링 부트 내의 전략 (0) | 2019.07.13 |
[SPRING] GSSException : 유효한 자격 증명이 제공되지 않는다 (기구 레벨 : Kerberos tgt를 찾지 못했습니다) (0) | 2019.07.13 |
[SPRING] 봄과 봄 부팅의 차이점 (0) | 2019.07.13 |