同时 http post 请求 spring 启动
Simultaneous http post request spring boot
你好,
我有一个大小为 500k 的列表,我必须向带有哈希参数的服务器发出请求。
服务器接受 JSON 200 个对象的数组。所以我每次可以发送 200 件物品。
但我仍然需要每次拆分列表并将该部分发送到服务器。
我有一个方法可以发出 http post 请求。我想使用 spring 引导选项(如果可用)用不同的线程调用方法并获取响应并将它们合并为一个。
我是使用 java CompletableFuture class 完成的,没有任何 springboot 标签。但是您也可以将 @async 用于您的方法。示例代码:
var futures = new ArrayList<CompletableFuture<List<Composite>>>();
var executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
for (List<CompositeRecord> records : Lists.partition(recordsList, 200)) {
var future = CompletableFuture.supplyAsync(() -> /* call your method here */, executor);
futures.add(future);
Thread.sleep(2000);
}
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).exceptionally(ex -> null).join(); // avoid throwing an exception in the join() call
var futureMap = futures.stream().collect(Collectors.partitioningBy(CompletableFuture::isCompletedExceptionally));
var compositeWithErrorList = new ArrayList<Composite>();
futureMap.get(false).forEach(l -> {
try {
compositeWithErrorList.addAll(l.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
});
执行代码后,您将得到一张已完成和未完成的未来地图。
服务器接受 JSON 200 个对象的数组。所以我每次可以发送 200 件物品。 但我仍然需要每次拆分列表并将该部分发送到服务器。
我有一个方法可以发出 http post 请求。我想使用 spring 引导选项(如果可用)用不同的线程调用方法并获取响应并将它们合并为一个。
我是使用 java CompletableFuture class 完成的,没有任何 springboot 标签。但是您也可以将 @async 用于您的方法。示例代码:
var futures = new ArrayList<CompletableFuture<List<Composite>>>();
var executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
for (List<CompositeRecord> records : Lists.partition(recordsList, 200)) {
var future = CompletableFuture.supplyAsync(() -> /* call your method here */, executor);
futures.add(future);
Thread.sleep(2000);
}
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).exceptionally(ex -> null).join(); // avoid throwing an exception in the join() call
var futureMap = futures.stream().collect(Collectors.partitioningBy(CompletableFuture::isCompletedExceptionally));
var compositeWithErrorList = new ArrayList<Composite>();
futureMap.get(false).forEach(l -> {
try {
compositeWithErrorList.addAll(l.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
});
执行代码后,您将得到一张已完成和未完成的未来地图。