Возврат файла Excel в виде потока октетов с помощью Mono <DataBuffer>в Spring Webflux приводит к ожиданию запроса GET до прерывания - PullRequest
0 голосов
/ 07 мая 2020

Я «попытался» написать контроллер, используя Spring Webflux с Mono, чтобы вернуть созданную рабочую книгу сгенерированного файла excel. Все работает нормально - поэтому журнал logi c был протестирован на единицу.

Однако, что НЕ работает, так это logi c контроллера. Похоже, что вызов конечной точки API находится в ожидании l oop навсегда.

Вот пример curl для этой конечной точки:

$ curl http://localhost:6666/api/categories/export/excel -H 'Content-type: application/octet-stream' -o output.xlsx
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:29:14 --:--:--     0

Как вы видно, что прошло около 29 минут, и ничего не произошло. Здесь вы можете увидеть лог c контроллера. Возможно, я неправильно использовал концепцию реактивности здесь, поэтому, пожалуйста, попытайтесь объяснить мне, что я делаю не так с этой конечной точкой logi c:

@RestController
@RequestMapping(value = ["api/categories"])
class CategoryExportController(val categoryRepository: CategoryRepository,
                               val exportCategoryExcelBuilder: ExportCategoryExcelBuilder) {

    @GetMapping(value = ["export/excel"],
            produces = [MediaType.APPLICATION_OCTET_STREAM_VALUE])
    fun exportExcel(response: ServerHttpResponse,
                    @RequestParam(required = false) parentCategoryCode: String?): Mono<Void> {

        val categoryExportStream = buildExportStream(parentCategoryCode, response)
        return response.writeAndFlushWith { categoryExportStream }
    }

  // other logic
}
...