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

使用WebClient Spring WebFlux的多个请求

詹亮
2023-03-14

我试图使用WebClient并行地发出请求,但我不知道如何执行,因为无论我做什么,代码都不会等待请求完成。如果我只执行一个请求(注释片段),一切正常。有人能帮我吗?

@RequestMapping(method = [RequestMethod.POST], path = ["/upload/{batchId}"])
fun uploadFile(@RequestPart("file") file: Mono<FilePart>,
                       @PathVariable("batchId") batchId:String,
                       @RequestHeader("FILE-SIZE") fileSize:Int): Mono<ServiceResponse> {
    val webClient = WebClient.create(commandEndpoint)
    // return webClient.put().uri(seriesPath).retrieve().bodyToMono(String::class.java).map { ServiceResponse(it,0) }
    return file.map{it.transferTo(Paths.get(storagePath,"excel"))}
        .map{excelWorkbookToMetadata(WorkbookFactory.create(Paths.get(storagePath,"excel").toFile()))}
        .flatMapMany{Flux.fromIterable(it)}
        .flatMap {
            it.transactionId = batchId
            when (it) {
                is SeriesMetadata -> webClient.put().uri(seriesPath,it.id)
                    .body(BodyInserters.fromObject(it))
                    .retrieve()
                    .onStatus({ it == HttpStatus.BAD_REQUEST },{
                        println("ERROR")
                        Mono.error(RuntimeException("blah")) }).toMono()
                else -> Mono.error(NotImplementedError(""))
            }

        }
        .collectList()
        .map {ServiceResponse(batchId, it.size*2) }
}

共有1个答案

郭瀚海
2023-03-14

看起来,collectList()过滤掉在响应主体为空的情况下返回的空单声道。解决方案基本上是使用mono.DefaultifEmpty()方法,或者将retrieve()更改为exchange(),后者总是返回一些东西。至少这帮了我。

 类似资料:
  • 我必须对我的应用程序做一个压力测试,以创建1000个用户。为了创建用户,我使用JSON执行POST请求: 我不知道如何使用JMeter创建多个用户。有for循环吗?另外,我如何避免代码必须是唯一的,这样每个用户都需要一个唯一的代码?

  • 目前我正在研究聊天服务器/客户端项目。我正在努力使用 select 处理多个请求,我的服务器脚本使用 select 模块,但客户端脚本没有。结果是,当用户输入消息时,其他客户端必须编写自己的消息才能通读对话。我已经在网上搜索了很多示例,但只能找到带有 sys.stdin 的代码片段,这不是我想要的。 我很高兴收到任何指示/解释。 服务器代码: 客户端代码:

  • 问题内容: 我正在编写一个组件,该组件将向站点的两个不同路径发出请求,然后将其状态设置为结果响应数据。我的代码如下所示: 但是,当我去渲染我的两个状态时,我发现它们实际上仍然是空的,实际上还没有被设置为任何东西。我觉得我可能是错误地使用了Promises或fetch()API,或者误解了setState的工作方式或事物的组合。我进行了测试,发现在第一个then()之后,由于某种原因,我的data1

  • 但是,如下所示的调用序列使用相同的TCP连接。 我还没有对此进行调试,但OkHttp似乎迫使我们首先在主线程上发出阻塞HTTP请求,以获得TCP连接上下文,然后与其他线程共享该上下文?或者,我是不是漏掉了什么?

  • 我正在尝试使用FastAPI MongoDB创建一个API,它可以从请求中返回多个值。MongoDB充满了数据,使用mongoengine,我可以在向特定endpoint发送请求时查阅一个或所有数据。我现在要做的是从endpoint接收一个或多个数据,例如: 当查询endpoint< code > http://127 . 0 . 0 . 1:8000/rice 时,我得到一个JSON响应,其中包

  • 问题内容: 我有一个简单的Angular JS场景。我在一个视图中显示了一个专家列表,该列表包含编辑专家的操作,该操作将在另一视图中完成。这些视图来自服务器,并且不在一个文件中。它们不会一起加载。 在服务器上的另一个文件中,我有: 我的控制器是: 但是,任何数据都不会显示在编辑表单中。我使用Batarang检查了范围,但不会显示对象。 问题似乎是我在一个控制器上使用了两个(可能有两个以上)视图。但