복붙노트

[SPRING] Spring에서 @Async 호출이 완료되었는지 확인하는 방법은 무엇입니까?

SPRING

Spring에서 @Async 호출이 완료되었는지 확인하는 방법은 무엇입니까?

rsync 명령을 실행하는 메소드에 @Async 주석을 사용합니다. 한 번에이 메소드를 호출하는 10 개의 스레드가 있습니다. 필자의 요구 사항은 10 개의 모든 스레드가 rsync 명령을 완료 한 후 나머지 코드 만 실행해야하지만 10 개의 모든 스레드가 @Async 메서드를 완전히 실행했는지 여부를 확인하지 못합니다. 그래서 그것을 확인하는 방법을 말해주십시오.

해결법

  1. ==============================

    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. ==============================

    2.이 작업을 완료 한 후 코드를 완료하려면 @Async를 사용하면 안됩니다. 어떤 이유로 비동기 적으로 호출하면이 메서드에서 Future를 반환하고 값이 반환 될 때까지 기다려야합니다.

    이 작업을 완료 한 후 코드를 완료하려면 @Async를 사용하면 안됩니다. 어떤 이유로 비동기 적으로 호출하면이 메서드에서 Future를 반환하고 값이 반환 될 때까지 기다려야합니다.

  3. from https://stackoverflow.com/questions/29181057/how-to-check-that-async-call-completed-in-spring by cc-by-sa and MIT license