bestsource

Spring Web Client를 사용하여 여러 전화를 동시에 거는 방법은 무엇입니까?

bestsource 2023. 7. 8. 11:03
반응형

Spring Web Client를 사용하여 여러 전화를 동시에 거는 방법은 무엇입니까?

저는 3통의 통화를 동시에 실행하고 모두 끝나면 결과를 처리하고 싶습니다.

여기에 언급된 바와 같이 AsyncRestTemplate를 사용하여 이 작업을 수행할 수 있습니다. 여러 통화를 동시에 걸려면 AsyncRestTemplate를 사용하는 방법은 무엇입니까?

그러나 AsyncRestTemplate는 WebClient를 위해 더 이상 사용되지 않습니다.프로젝트에서 Spring MVC를 사용해야 하는데, 웹 클라이언트를 사용하여 동시 통화를 실행할 수 있는지 궁금합니다.Web Client를 사용하여 이 작업을 올바르게 수행하는 방법을 알려줄 수 있는 사람이 있습니까?

참조 문서에서와 같이 WebClient 래퍼를 가정합니다.

@Service
public class MyService {

    private final WebClient webClient;

    public MyService(WebClient.Builder webClientBuilder) {
        this.webClient = webClientBuilder.baseUrl("http://example.org").build();
    }

    public Mono<Details> someRestCall(String name) {
        return this.webClient.get().url("/{name}/details", name)
                        .retrieve().bodyToMono(Details.class);
    }

}

다음을 통해 비동기적으로 호출할 수 있습니다.

// ... 
  @Autowired
  MyService myService
  // ...

   Mono<Details> foo = myService.someRestCall("foo");
   Mono<Details> bar = myService.someRestCall("bar");
   Mono<Details> baz = myService.someRestCall("baz");
   
   // ..and use the results (thx to: [2] & [3]!):

   // Subscribes sequentially:

   // System.out.println("=== Flux.concat(foo, bar, baz) ===");
   // Flux.concat(foo, bar, baz).subscribe(System.out::print);
    
   // System.out.println("\n=== combine the value of foo then bar then baz ===");
   // foo.concatWith(bar).concatWith(baz).subscribe(System.out::print);
  
   // ----------------------------------------------------------------------
   // Subscribe eagerly (& simultaneously):
   System.out.println("\n=== Flux.merge(foo, bar, baz) ===");
   Flux.merge(foo, bar, baz).subscribe(System.out::print);

감사합니다. 환영합니다. 잘 부탁드립니다.

단순을 사용하여 HTTP 통화를 동시에 할 수 있습니다.RestTemplate그리고.ExecutorService:

RestTemplate restTemplate = new RestTemplate();
ExecutorService executorService = Executors.newCachedThreadPool();

Future<String> firstCallFuture = executorService.submit(() -> restTemplate.getForObject("http://first-call-example.com", String.class));
Future<String> secondCallFuture = executorService.submit(() -> restTemplate.getForObject("http://second-call-example.com", String.class));

String firstResponse = firstCallFuture.get();
String secondResponse = secondCallFuture.get();

executorService.shutdown();

또는

Future<String> firstCallFuture = CompletableFuture.supplyAsync(() -> restTemplate.getForObject("http://first-call-example.com", String.class));
Future<String> secondCallFuture = CompletableFuture.supplyAsync(() -> restTemplate.getForObject("http://second-call-example.com", String.class));

String firstResponse = firstCallFuture.get();
String secondResponse = secondCallFuture.get();

Spring 반응형 클라이언트를 사용할 수 있습니다.WebClient병렬 요청을 보냅니다.이 예에서는,

public Mono<UserInfo> getUserInfo(User user) {
        Mono<UserInfo> userInfoMono = getUserInfo(user.getId());
        Mono<OrgInfo> organizationInfoMono = getOrgInfo(user.getOrgId());

        return Mono.zip(userInfoMono, organizationInfoMono).map(tuple -> {
            UserInfo userInfo = tuple.getT1();
            userInfo.setOrganization(tuple.getT2());
            return userInfo;
        });
    }

여기:

  • getUserInfo다른 서비스에서 사용자 정보를 가져오기 위해 HTTP 통화를 하고 반환합니다.Mono
  • getOrgInfo메소드는 다른 서비스에서 조직 정보를 가져오기 위해 HTTP를 호출하고 반환합니다.Mono
  • Mono.zip()모든 모노의 모든 결과를 대기하고 새 모노로 병합하여 반환합니다.

그럼, 콜getOrgUserInfo().block()최종 결과를 얻기 위해.

다른 방법:

public Mono<Boolean> areVersionsOK(){
        final Mono<Boolean> isPCFVersionOK = getPCFInfo2();
        final Mono<Boolean> isBlueMixVersionOK = getBluemixInfo2();

        return isPCFVersionOK.mergeWith(isBlueMixVersionOK)
            .filter(aBoolean -> {
                return aBoolean;
            })
            .collectList().map(booleans -> {
                return booleans.size() == 2;
        });

    }

언급URL : https://stackoverflow.com/questions/50203875/how-to-use-spring-webclient-to-make-multiple-calls-simultaneously

반응형