【发布时间】:2021-03-29 19:12:42
【问题描述】:
我有一个 Spring Boot 应用程序,它将使用 GET 方法调用多个微服务 URL。这些微服务 URL 端点都实现为@RestControllers。他们不会返回 Flux 或 Mono。
我需要我的应用程序来捕获哪些 URL没有返回 2xx HTTP 状态。
我目前正在使用以下代码来执行此操作:
List<String> failedServiceUrls = new ArrayList<>();
for (String serviceUrl : serviceUrls.getServiceUrls()) {
try {
ResponseEntity<String> response = rest.getForEntity(serviceUrl, String.class);
if (!response.getStatusCode().is2xxSuccessful()) {
failedServiceUrls.add(serviceUrl);
}
} catch (Exception e){
failedServiceUrls.add(serviceUrl);
}
}
// all checks are complete so send email with the failedServiceUrls.
mail.sendEmail("Service Check Complete", failedServiceUrls);
}
问题是每个 URL 调用响应缓慢,我必须等待一个 URL 调用完成才能进行下一个调用。
如何更改此设置以同时进行 URL 调用?在所有通话完成后,我需要发送一封电子邮件,其中包含应收集到 failedServiceUrls 中的任何错误 URL。
更新
我修改了上面的帖子,声明我只想同时拨打电话。我不在乎 rest.getForEntity 调用阻塞。
【问题讨论】:
-
据我所知,您可以创建几个 Completable Futures,然后您可以随时等待它们完成工作
-
你需要非阻塞实现,还是需要并行执行?
-
你想要它们同时和非阻塞还是两者兼而有之?因为 CompletableFuture 将提供并发,但不提供 nio。
-
答案可能取决于您对并发和 NIO 问题的很多澄清。一个简单的解决方案可能是将 NIO 的请求工厂传递给您的 RestTemplate(例如 Netty4ClientHttpRequestFactory)是 NIO。但是根据您的意思,还有很多其他选择。
-
我为歧义道歉。我已经更新了我的问题。
标签: java spring multithreading spring-boot spring-webflux