我需要创建一个从API端点下载文件并将其上传到另一个API端点的进程。该文件的最大大小为100MB,但我们将并行运行许多进程。我试图实现它与Spring WebClient和不存储在内存中的文件。当前代码将文件存储在内存中,因为使用大文件的测试会抛出OutOfMemoryError。
复制方法
public Mono<SyncStatusType> copy(Strin path1, String path2) {
return this.download(path1)
.collectList()
.flatMap(dataBuffers ->
this.upload(path2, Mono.just(dataBuffers).flatMapMany(Flux::fromIterable)))
.map(item -> SyncStatusType.SUCCESSFUL);
}
下载方法private Flux<DataBuffer> download(String path) {
return this.getWebClient()
.get()
.uri(uriBuilder -> uriBuilder
.path(path)
.build())
.retrieve()
.bodyToFlux(DataBuffer.class);
}
上传方法private Mono<CustomFileDto> upload(String path, Flux<DataBuffer> dataBuffer) {
return this.getWebClient()
.put()
.uri(uriBuilder -> uriBuilder
.path(path)
.build())
.contentType(MediaType.APPLICATION_JSON)
.body(BodyInserters.fromDataBuffers(dataBuffer))
.retrieve()
.bodyToMono(CustomFileDto.class)
}
我如何修改这段代码,使它不存储在内存中的文件内容?
我有一个Spring WebFlux多部分示例,上传/下载文件并将它们存储在Mongo GridFS中,查看我的Github上的完整代码。
测试代码演示了WebFlux客户端的交互。