我有一个URL列表。..列表的大小每次都改变。现在我需要下面的代码转换为动态。..我想使用动态循环并将CountDownLatch
设置为动态,以确保所有的URL都有答案,如果可能的话。
public class ApiCallerService {
private RestTemplate restTemplate;
public ApiCallerService(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
public Map<String, String> callApis() throws InterruptedException {
CountDownLatch latch = new CountDownLatch(3);
String response1 = "";
String response2 = "";
String response3 = "";
String url1 = "http://....";
String url2 = "http://....";
String url3 = "http://....";
new Thread(() -> {
response1 = restTemplate.getForObject(url1, String.class);
latch.countDown();
}).start();
new Thread(() -> {
response2 = restTemplate.getForObject(url2, String.class);
latch.countDown();
}).start();
new Thread(() -> {
response3 = restTemplate.getForObject(url3, String.class);
latch.countDown();
}).start();
latch.await();
Map<String, String> map = new HashMap<>();
map.put(url1, response1);
map.put(url2, response2);
map.put(url3, response3);
return map;
}
}
谢谢
2条答案
按热度按时间bxjv4tth1#
当你使用Sping Boot 时,利用Spring Task抽象来异步提交作业并获取结果。Sping Boot 默认创建一个
TaskExecutor
(可通过spring.task
命名空间配置),您可以使用它。另一种选择是使用
WebClient
,默认情况下它是被动的(因此是异步的),并且也允许收集结果。无论哪种方式都不要创建自己的
Thread
示例,使用池,就好像你不断创建线程,最终你会耗尽资源。ddarikpa2#
您可以使用Java Streams进行动态处理,如下所示