Почему мое приложение Spring webflux создает временный файл при каждом запросе? - PullRequest
0 голосов
/ 10 июня 2019

Почему Spring Webflux (или Java Nio) создает многопользовательский DataBuffer TMP-файл?

в моем случае на macOS, файлы типа /private/var/folders/v6/vtrxqpbd4lb3pq8v_sbm10hc0000gn/T/nio-file-upload/nio-body-1-82f11dbe-61b3-4e5d-8c43-92e02aa38481.tmp создаются по запросу, а затем удаляются.

возможно ли повысить производительность, предотвратив запись на диск?

это мой код:

public class FileHandler {
    public Mono<ServerResponse> postFile(ServerRequest req) {
        val file = req.multipartData()
                .map(map -> map.getFirst("file"))
                .ofType(FilePart.class);
        val buffer = file.flatMap(part -> part.content().next());
        val hash = buffer.map(d -> {
            try {
                val md = MessageDigest.getInstance("SHA-1");
                md.update(d.asByteBuffer());
                return Base64Utils.encodeToString(md.digest());
            } catch (NoSuchAlgorithmException e) {
                // does not reach here!
                return "";
            }
        });
        val name = file.map(FilePart::filename);
        return ok().body(hash, String.class);
    }
}

1 Ответ

1 голос
/ 12 июня 2019

Для поддержки многокомпонентных файлов в Spring WebFlux используется многочастная библиотека Synchronoss NIO . Недостатком этой реализации является то, что она не полностью реагирует и в результате может создавать временные файлы, чтобы не загружать весь контент в память.

Что заставляет вас думать, что такое поведение является проблемой производительности? У вас есть пример или результаты тестов, которые показывают, что это проблема?

Команда Spring Framework уже работала над этим, и полностью реактивная реализация будет доступна по умолчанию в Spring Framework 5.2 (см. spring-framework # 21659 ).

...