weblient流量块

myzjeezk  于 2021-07-09  发布在  Java
关注(0)|答案(0)|浏览(440)

我相信有更好的方法可以做到这一点,但我在webflux上有了新的开始,而且还在学习

我有一个需求,我需要为一个服务对不同的web服务进行异步调用(每次都是相同的端点,使用不同的queryparameters,所以称它为不同的服务)。存在动态的下游呼叫数
服务[a]——服务B[1]、服务B[2]、服务B[3]、服务B[4]等
现在,当我从serviceb[n]的每个示例得到响应时,我需要知道“this”响应是针对哪个请求的(1、2、3、4等等)。原因是我需要在请求的末尾附加thai,以便按特定顺序作为响应发送。它们需要按照与原始请求相同的顺序追加因此,我需要确定对其请求的响应)。我正在给一个名单,上面有他们被要求的顺序。
我有下面的代码,它的工作功能。i、 e.当我向服务-a发出一个请求时(即从4个呼叫到4个服务-b呼叫)
但是,当存在对service-a的并行请求时,我看到flux.merge(asyncrequestlist).collectlist().block()调用不会等待所有resposne,并且仍然从方法返回。所以我错过了一些回答。

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; 
}

有人能给我指出正确的方向吗?我可以使用什么工具来调试它(任何网络监视器等)

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题