Несколько запросов с использованием WebClient Spring WebFlux - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь делать запросы, используя 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 Ответ

0 голосов
/ 04 октября 2019

Таким образом, похоже, что collectList () отфильтровывает пустые моно, которые возвращаются, если тело ответа пусто. Решение в основном, либо использовать метод Mono.defaultIfEmpty (), либо изменить retrieve () на exchange (), который всегда что-то возвращаетПо крайней мере, это то, что помогло мне.

...