我正在使用Spring Boot 2.1.6.RELEASE和Webflux构建应用程序
我们有一个端点,可以使用多部分上传文件,并且使用WebClient进行上传。
我们的上传客户端代码如下
@Component
class UploadClient(
private val client: WebClient,
) {
suspend fun upload(filePath: String) =
client.post()
.uri("/upload")
.contentType(MULTIPART_FORM_DATA)
.body(BodyInserters.fromMultipartData(generateMultipartBody(filePath)))
.retrieve()
.bodyToMono(UploadResult::class.java)
.awaitFirst()
private fun generateMultipartBody(filePath: String): MultiValueMap<String, HttpEntity<*>> {
val builder = MultipartBodyBuilder()
builder.part("file", FileSystemResource(filePath))
return builder.build()
}
}
但是,当我们上传一个大文件(1.6gb)时,我们看到整个文件都已加载到直接内存中
文件上传后,内存将释放,然后在下一个文件上传时,您会再次看到内存峰值。
为了对比,我尝试用https://github.com/AsyncHttpClient/async-http-client替换WebClient,并且内存使用量要低得多,每次上传大约60mb
当WebFlux客户端适合我们所有其他用途时,我真的不想引入另一个http客户端依赖项。
答案 0 :(得分:2)
这是Spring Framework中的错误-https://github.com/spring-projects/spring-framework/issues/23518