[SPRING] Spring WebClient를 사용하여 여러 개의 호출을 동시에 수행하는 방법?
SPRINGSpring WebClient를 사용하여 여러 개의 호출을 동시에 수행하는 방법?
나는 3 개의 호출을 동시에 수행하고 모두 완료되면 결과를 처리하려고합니다.
AsyncRestTemplate을 사용하여 여기에 언급 된대로이 작업을 수행 할 수 있다는 것을 알고 있습니다. AsyncRestTemplate을 사용하여 여러 호출을 동시에 수행하는 방법은 무엇입니까?
그러나 AsyncRestTemplate은 WebClient를 위해 더 이상 사용되지 않습니다. 프로젝트에서 Spring MVC를 사용해야하지만 동시 호출을 실행하기 위해 WebClient를 사용할 수 있다면 관심이 있습니다. 누군가 WebClient를 통해이 작업을 어떻게 제대로 수행해야하는지 조언 할 수 있습니까?
해결법
-
==============================
1.WebClient 래퍼 (예 : 참조 문서)를 가정합니다.
WebClient 래퍼 (예 : 참조 문서)를 가정합니다.
@Service public class MyService { private final WebClient webClient; // the reference doc seems incorrect saying "public MyBean(" :) 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);
[2] [3]
감사, 환영 & 친절 감사합니다,
-
==============================
2.또 다른 방법:
또 다른 방법:
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; }); }
-
==============================
3.간단한 RestTemplate 및 ExecutorService를 사용하여 HTTP 호출을 동시에 수행 할 수 있습니다.
간단한 RestTemplate 및 ExecutorService를 사용하여 HTTP 호출을 동시에 수행 할 수 있습니다.
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();
from https://stackoverflow.com/questions/50203875/how-to-use-spring-webclient-to-make-multiple-calls-simultaneously by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 모든 BeanPostProcessors가 처리 할 수없는 클래스 (0) | 2019.06.07 |
---|---|
[SPRING] Servlet 또는 @Controller를 사용해야하는 경우 (0) | 2019.06.06 |
[SPRING] 사용자가 자신의 프로필 만 업데이트하도록 스프링 부트 보안을 구성하는 방법 (0) | 2019.06.05 |
[SPRING] org.springframework.boot 패키지가 존재하지 않습니다. (0) | 2019.06.05 |
[SPRING] 값 목록을 확인하는 javax.validation? (0) | 2019.06.04 |