Java 订阅的WebClient流量块

Java 订阅的WebClient流量块,java,spring-webflux,webclient,block,flux,Java,Spring Webflux,Webclient,Block,Flux,***我确信有更好的方法可以做到这一点,但我正在webflux上重新开始,并且仍然在学习*** 我有一个需求,我需要为一个服务对不同的web服务进行异步调用(每次都是相同的端点,使用不同的queryparameters,所以调用它是一个不同的服务)。下游呼叫的数量是动态的 服务[A]--->ServiceB[1]、ServiceB[2]、ServiceB[3]、ServiceB[4]等 现在,当我从ServiceB[n]的每个实例获得响应时,我需要知道“this”响应是针对哪个请求的(1、2、3

***我确信有更好的方法可以做到这一点,但我正在webflux上重新开始,并且仍然在学习***

我有一个需求,我需要为一个服务对不同的web服务进行异步调用(每次都是相同的端点,使用不同的queryparameters,所以调用它是一个不同的服务)。下游呼叫的数量是动态的

服务[A]--->ServiceB[1]、ServiceB[2]、ServiceB[3]、ServiceB[4]等

现在,当我从ServiceB[n]的每个实例获得响应时,我需要知道“this”响应是针对哪个请求的(1、2、3、4等等)。原因是我需要在请求的末尾附加thais,以便按特定顺序作为响应发送。它们需要按照与原始请求相同的顺序追加。(因此,我需要确定对其请求的响应)。我正在写一份清单,上面有他们被要求的顺序

我有下面的代码,它的功能。也就是说,当我向服务-A发出一个请求时(这会向4个服务B发出4个呼叫)

但是,当存在对Service-A的并行请求时,我看到Flux.merge(asyncRequestList).collectList().block()调用并不等待所有响应,仍然从方法返回。所以我错过了一些回应

 public List<ResultSet> invoke(List<ResultSet> requestPayload) {
    String endpoint = "https://ourserver.hostname.com/our-service/api/v1/context?reference={servicereference}"
    List<ResultSet> responsePayload = requestPayload;
    ArrayList<Mono<String>> asyncRequestList = new ArrayList<>();

    /*
        "Request" is a Pojo with 4 fields
        JsonNode request;
        String reference;
        JsonNode response;
        int order; 
    */
        
    for (Requests req : requestPayload) {
        asyncRequestList.add(
            req.getOrder(),
            webClient.post()
                .uri(new UriTemplate(endpoint).expand(reference))
                .body(BodyInserters.fromValue(req.getRequest()))
                .retrieve()
                .bodyToMono(String.class)
                .timeout(Duration.ofSeconds(20)));

            // register the callback
         asyncRequestList.get(req.getOrder()).subscribe(s2 -> {
             logger.info("Got response :: Request Id : {}, for Reference{}",
                                req.getRequestId(), req.getReference());
                responsePayload.get(req.getOrder()).setResponse(mapper.mapFromString(s2));
        });
    }

    //wait for all responses
    Flux.merge(asyncRequestList).collectList().block();
    logger.info("Got all responses. ");

    return responsePayload; 
}
公共列表调用(列表请求有效负载){
字符串端点=”https://ourserver.hostname.com/our-service/api/v1/context?reference={servicereference}”
List responsePayload=requestPayload;
ArrayList asyncRequestList=新建ArrayList();
/*
“请求”是一个包含4个字段的Pojo
JsonNode请求;
字符串引用;
JsonNode响应;
整数阶;
*/
用于(请求请求:请求有效负载){
asyncRequestList.add(
req.getOrder(),
webClient.post()
.uri(新的UriTemplate(端点).expand(引用))
.body(BodyInserters.fromValue(req.getRequest()))
.retrieve()
.bodyToMono(String.class)
。超时(持续时间为秒(20));
//注册回调
asyncRequestList.get(req.getOrder()).subscribe(s2->{
info(“获取响应::请求Id:{},用于引用{}”,
req.getRequestId(),req.getReference());
responsePayload.get(req.getOrder()).setResponse(mapper.mapFromString(s2));
});
}
//等待所有响应
Flux.merge(asyncRequestList.collectList().block();
logger.info(“获得所有响应”);
返回响应payload;
}
有人能给我指一下正确的方向吗?
我可以使用什么工具来调试它(任何网络监视器等)

当您迭代(Requests-req:requestPayload){时,您是否实际拥有4个有效负载?我认为您必须链接
requestPayload.map()..…
到您到达的点
Flux.merge
。在回答任何问题之前,这是一个完全反应的应用程序。还是一个Spring MVC(web)应用程序。@Felipe是的,在正常运行期间(当所有响应都正常时)这是一个基于REST模板的MiROServices的链接。这一个微服务在中间的某个地方。它使用WebCube来建立它的下游微服务。立即下游的微服务又是一个基于REST模板的服务。(我确实有机会使其完全反应,但不确定其影响如何)