为什么我的Spring webflux应用程序会在每个请求上创建临时文件?

时间:2019-06-10 08:01:21

标签: java spring nio spring-webflux bytebuffer

为什么Spring Webflux(或Java Nio)制作multipartData 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 个答案:

答案 0 :(得分:1)

multipart file support in Spring WebFlux is using the Synchronoss NIO Multipart library。该实现的缺点是它不能完全响应,因此它可以创建临时文件而不将整个内容加载到内存中。

是什么让您认为此行为是性能问题?您是否有样本或基准测试结果表明存在问题?

Spring Framework团队已经在进行此工作,并且在Spring Framework 5.2中,默认情况下将提供完全可响应的实现(请参见spring-framework#21659)。