使用并发请求调用 Rest 端点
Posted
技术标签:
【中文标题】使用并发请求调用 Rest 端点【英文标题】:Call Rest end point with concurrent request 【发布时间】:2021-12-16 11:14:01 【问题描述】:"url":"https://asia-east2-jsondoc.cloudfunctions.net/function-1?delay=1000" //url that takes 1000 ms to return "isParallel": true, "count": "3"
isParallel = true 表示进行并行调用,false 表示 – 进行顺序调用,count 表示要进行的并行或顺序调用的数量。
我必须调用上面的端点,输出应该是 1 秒。
如何使用并发请求调用其余端点?我知道如何使用 rest 模板调用单线程。
【问题讨论】:
你有什么问题吗? 问题是如何用并发请求调用其余端点?我知道如何使用 rest 模板调用单线程。 分享您的研究对每个人都有帮助。告诉我们您尝试了什么以及为什么它不能满足您的需求。这表明您已经花时间尝试帮助自己,它使我们免于重复明显的答案,最重要的是它可以帮助您获得更具体和相关的答案!另见:How to Ask 【参考方案1】:将RestTemplate
与ExecutorService
一起使用
使用ExecutorService
与RestTemplate
进行3个并发调用:
Strnig url = "https://asia-east2-jsondoc.cloudfunctions.net/function-1?delay=1000";
RestTemplate restTemplate = new RestTemplate();
ExecutorService executor = Executors.newFixedThreadPool(3);
Future<String> future1 = executor.submit(() -> restTemplate.getForObject(url , String.class));
Future<String> future2 = executor.submit(() -> restTemplate.getForObject(url , String.class));
Future<String> future3 = executor.submit(() -> restTemplate.getForObject(url , String.class));
String response1 = future1.get();
String response2 = future2.get();
String response3 = future3.get();
executor.shutdown();
使用反应式WebClient
使用响应式WebClient
执行3 个并发调用并在subscribe
回调中显示响应:
String url = "https://asia-east2-jsondoc.cloudfunctions.net/function-1?delay=5000";
WebClient webClient = WebClient.builder().build();
Mono<String> mono1 = webClient.get().uri(url).retrieve().bodyToMono(String.class);
Mono<String> mono2 = webClient.get().uri(url).retrieve().bodyToMono(String.class);
Mono<String> mono3 = webClient.get().uri(url).retrieve().bodyToMono(String.class);
Flux.merge(mono1, mono2, mono3).subscribe(System.out::println);
【讨论】:
以上是关于使用并发请求调用 Rest 端点的主要内容,如果未能解决你的问题,请参考以下文章
具有授权的 Keycloak 自定义 SPI REST 端点