복붙노트

[SPRING] Spring @Async with CompletableFuture

SPRING

Spring @Async with CompletableFuture

나는이 코드에 대해 의심이있다 :

@Async
public CompletableFuture<String> doFoo() {
    CompletableFuture<String> fooFuture = new CompletableFuture<>();  

    try {
        String fooResult = longOp();
        fooFuture.complete(fooResult);
    } catch (Exception e) {
        fooFuture.completeExceptionally(e);
    }

    return fooFuture;
}

문제는 doFoo가 longOp가 (올바르게 또는 예외적으로) 종료 된 후에 만 ​​fooFoo를 반환하고 따라서 이미 완료된 미래를 반환하거나 Spring이 일부 마술을 수행하고 본문을 실행하기 전에 반환하는지 여부입니다. longOp ()에서 코드가 블로킹 된 경우 계산이 실행 프로그램에 공급되고 있음을 어떻게 표현하겠습니까?

아마 이것? 다른 방법이라도?

@Async
public CompletableFuture<String> doFoo() {

    CompletableFuture<String> completableFuture = new CompletableFuture<>();
    CompletableFuture.runAsync(() -> {
        try {
            String fooResult = longOp();
            completableFuture.complete(fooResult);
        } catch (Exception e) {
            completableFuture.completeExceptionally(e);
        }
    });
    return completableFuture;
}

해결법

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

    1.Spring은 실제로 커버 안의 모든 작업을 수행하므로 CompletableFuture를 직접 만들 필요가 없습니다. 기본적으로 @Async 주석을 추가하는 것은 원래 메소드 (주석없이)를 다음과 같이 호출 한 것과 같습니다.

    Spring은 실제로 커버 안의 모든 작업을 수행하므로 CompletableFuture를 직접 만들 필요가 없습니다. 기본적으로 @Async 주석을 추가하는 것은 원래 메소드 (주석없이)를 다음과 같이 호출 한 것과 같습니다.

    CompletableFuture<User> future = CompletableFuture.runAsync(() -> doFoo());
    

    두 번째 질문에 대해서는 실행자에게 피드를 제공하기 위해 다음과 같이 @Async 주석의 값에 executor bean 이름을 지정할 수있다.

        @Async("myExecutor")
        public CompletableFuture<User> findUser(String usernameString) throws InterruptedException {
            User fooResult = longOp(usernameString);
            return CompletableFuture.completedFuture(fooResult);
        }
    

    위의 내용은 마치 원래의 메서드를 호출 한 것처럼 다음과 같습니다.

    CompletableFuture<User> future = CompletableFuture.runAsync(() -> doFoo(), myExecutor);
    

    그리고 모든 예외적 인 논리는 그 메소드에서 반환 된 CompletableFuture로 처리 할 것입니다.

  2. from https://stackoverflow.com/questions/47351435/spring-async-with-completablefuture by cc-by-sa and MIT license