반응형
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
반응형
'bestsource' 카테고리의 다른 글
발그랜드에게 memcheck 분기된 프로세스를 어떻게 알려줍니까? (0) | 2023.07.13 |
---|---|
rest와 함께 부울 값을 반환하는 방법은 무엇입니까? (0) | 2023.07.08 |
oracle.jdbc에 연결을 캐스트할 수 없습니다.오라클 연결 (0) | 2023.07.08 |
계산된 속성이 서로 다른 탭에서 UI를 업데이트하지 않음 (0) | 2023.07.08 |
자바.java.java잘못된 상태 예외:로드 밸런싱에 대한 페이그니 클라이언트가 정의되지 않았습니다.봄-구름-스타터-넷플릭스-리본을 포함하는 것을 잊으셨습니까? (0) | 2023.07.08 |