completablefuture按请求组分组

11dmarpk  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(422)

我想向api rest发送10万个请求。所以我有一个循环,以同步方式发送请求(完成所有请求需要几分钟)。
但最好是以异步方式发送它们,这样过程所需的时间就更少了,因为目标可以扩展它们的副本。
我读过关于completablefuture以及如何将所有结果与 allOf() 方法。
但是有没有什么方法可以让1k请求一组一组地打电话呢?因为如果我并行发送所有请求,目的地就会关闭连接。
因此,我想以1k并行请求为一组发送请求,当每个组完成时,对响应做一些处理(我不需要排序响应)
谢谢。

gupuwyp2

gupuwyp21#

是的,你可以使用完全期货和它做得很容易。
假设您有一个http客户机,它在请求时返回completablefuture。

package com.example.demo.cf;

import com.example.demo.dto.Response;

import java.util.concurrent.CompletableFuture;

public interface HttpClient {
    CompletableFuture<Response> makeHttp();
}

并提供批量和排序请求的服务。

package com.example.demo.cf;

import java.util.concurrent.CompletableFuture;
import java.util.stream.IntStream;

public class CfBatchingService {

    private static final int BATCH_SIZE = 100;

    private HttpClient httpClient;

    public void sendRequests() {
        CompletableFuture<Void> cf = CompletableFuture.completedFuture(null);
        for(int grp = 0; grp < 10; grp++) {
            cf = cf.thenCompose(unused -> CompletableFuture.allOf(IntStream.range(0, BATCH_SIZE).mapToObj(idx -> httpClient.makeHttp()).toArray(CompletableFuture[]::new)));
        }

        cf.whenComplete((unused, throwable) -> {
           System.out.println("All requested executed");
        });
    }

}

所以,这里唯一需要的就是 thenCompose 方法,该方法期望从lambda获得completablefuture。
将请求分组为批并创建单个 CompletableFuture 你可以用这个方法 CompletableFuture.allOf

相关问题