Реактивный способ чтения и анализа файлов из ресурсов с помощью WebFlux? - PullRequest
1 голос
/ 10 апреля 2020

Интересно, как правильно читать, анализировать и обслуживать файл из ресурсов.

В настоящее время я делаю что-то вроде этого:

fun getFile(request: ServerRequest): Mono<ServerResponse> {
    val parsedJson =
        objectMapper.readValue(readFile("fileName.json"), JsonModel::class.java)

    // modify parsed json

    return ok().contentType(APPLICATION_JSON).bodyValue(parsedJson)
}

private fun readFile(fileName: String) =
    DefaultResourceLoader()
        .getResource(fileName)
        .inputStream.bufferedReader().use { it.readText() }

Я заметил JsonObjectDecoder класс в Netty, но я не знаю, может ли быть применен к моему варианту использования.

Каков реактивный способ сделать чтение / анализ файла ресурсов тогда?

Ответы [ 2 ]

2 голосов
/ 13 апреля 2020

После расширения ответа @vins я пришел к следующему решению:

Jackson2JsonDecoder()
    .decodeToMono(
        DataBufferUtils.read(
            DefaultResourceLoader()
                .getResource("$fileName.json"),
            DefaultDataBufferFactory(),
            4096
        ),
        ResolvableType.forClass(JsonModel::class.java), null, null
    )
    .map { it as JsonModel }
1 голос
/ 13 апреля 2020

Вы можете взглянуть на Flux.using здесь для чтения файла.

Поскольку вы используете Spring Framework, вы также можете взглянуть на DataBufferUtils.

DataBufferUtils использует AsynchronousFileChannel для чтения файла, а также внутренне использует Flux.using для освобождения файла после того, как файл прочитан / отменен подписчиком.

@Value("classpath:somefile.json")
private Resource resource;


@GetMapping("/resource")
public Flux<DataBuffer> serve(){
   return DataBufferUtils.read(
            this.resource,
            new DefaultDataBufferFactory(),
            4096
    );
}
...