当前位置: 首页 > 知识库问答 >
问题:

Spring Flux等待阵列完成填充导致阻塞

吴胜涝
2023-03-14

我正在调用一个APIendpoint,该endpoint返回数据作为

{"length":850,"maxPageLimit":2500,"totalRecords":1700,
"data":[
{"date":"2022-06-29","newCasesByPublishDate":14476,"cumCasesByPublishDate":2005335},
{"date":"2022-06-26","newCasesByPublishDate":0,"cumCasesByPublishDate":1990859},
....
]}

#Response headers
X-Firefox-Spdy  h2
cache-control   public, must-revalidate, max-age=90
content-encoding    gzip
content-location    https://api......&format=json&page=1
content-security-policy default-src 'none'; style-src 'self' 'unsafe-inline'
content-type    application/vnd.PHE-COVID19.v1+json; charset=utf-8

我希望将数据数组中的每个条目作为flux jsonnode流返回。但是,在执行此操作之前,它会等待阵列完成。如何防止web客户端调用在阵列完成之前等待和阻止调用?或者这是预期的行为,我需要从所有者API请求更改以反应式方式发送数据?

    public Flux<JsonNode> fetchCovidStatsFor(Area area, AreaType areaType, List<Metrics> metricsList) {
        var request =  generateWebClient().get()
                .uri(uriBuilder -> uriBuilder
                        .queryParam(buildRequestFilters(area, areaType))
                        .queryParam(buildRequestStructures(metricsList))
                        .build())
                .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
        log.debug("request URI: {}", request.httpRequest(ClientHttpRequest::getURI));
        return request.retrieve()
                .bodyToFlux(JsonNode.class)
                .map(jsonNode -> jsonNode.get("data"))
                .doOnNext(jsonNode -> {System.out.println(jsonNode);});
    }

共有1个答案

傅乐湛
2023-03-14

调用的API控制数据流,因此应将其更改为以流的形式生成数据。这是一个使用MediaType的示例API。APPLICATION\u NDJSON\u值:

@GetMapping(produces = MediaType.APPLICATION_NDJSON_VALUE)
public Flux<JsonNode> list(){
    return service.list().delayElements(Duration.ofSeconds(1));
}  
 类似资料:
  • 我通读了Dart/flatter中的Async/Await/then,试图理解为什么aysnc函数中的Await不会等到完成后再继续。在我的UI中,有一个按钮调用一个异步方法来返回一个位置,该位置总是返回null,并且不等待函数完成。 该函数将调用推送到一个新的UI页面,该页面选择一个位置,并应返回一个结果。如何使该函数等待结果?我不是在使用异步吗?

  • 问题内容: 我有一个登录框架,我必须从另一个线程等待。成功登录后,框架将自行处置。我想弹出该应用程序的主框架。现在,我正在观看一个布尔值,以确定何时启动主机。正确的做法是什么?观看布尔值只是感觉并不优雅。 问题答案: 如果您有Java 5或更高版本,则可以使用CountDownLatch。例如,假设主框架最初处于控制状态,则让主框架创建一个倒数为1的,然后将此锁存器传递给登录框架。然后让主机等待锁

  • 问题内容: 我通过将操作拆分为可用的确切内核数来并行化操作,然后通过启动相同数量的AsyncTask,对数据的不同部分执行相同的操作。 我正在使用以并行化它们的执行。 我想知道每个线程何时完成其工作,以便结合所有结果并执行进一步的操作。 我能怎么做? 问题答案: 您还可以简单地将共享库中的计数器递减作为的一部分。由于在同一线程(主线程)上运行,因此您不必担心同步。 更新1 共享对象可能看起来像这样

  • 问题内容: 我的问题: 如何在a上执行一堆线程对象并等待它们全部完成后再继续? 我是ThreadPoolExecutor的新手。因此,此代码是测试以了解其工作方式。现在我什至都不用对象填充,因为我不理解如何在不调用另一个队列的情况下开始队列。无论如何,现在我只是打电话给我,但我认为我仍然缺少一些东西。任何提示都很棒!谢谢。 RunnableObject类: 问题答案: 你应该循环

  • 我正在用JavaFX开发一个数据挖掘应用程序,它依赖于WebView(因此也依赖于WebEngine)。挖掘分两步进行:首先,用户使用UI导航到WebView中的一个网站,以配置可以在哪里搜索感兴趣的数据。其次,使用定期运行的后台任务,WebEngine加载相同的文档,并尝试从加载的文档中提取数据。 这种方法在大多数情况下都能很好地工作,但是最近我遇到了一些使用AJAX呈现内容的页面的麻烦。为了检

  • 当在postgres中进行并发更新时,我得到一个 错误:由于并发更新,无法序列化访问 有没有办法让事务等到另一个事务完成,而不是因错误而失败? 这是我的测试案例: 并且另一个会话(会话2)同时发生 如何使事务等待上一个事务完成再执行。截至目前,它不会执行,它只会报告错误,这让我在服务器上管理故障逻辑。是否有可以使用类似事务队列的东西?或者也许是一个语句,用于检查是否有其他事务正在进行,然后等待它解