【发布时间】:2021-06-13 16:55:44
【问题描述】:
有一个Flux<DataBuffer>。将其转换为Mono<byte[]> 的自然方式是什么?
Mono<byte[]> mergeDataBuffers(Flux<DataBuffer> flux){
// ?
}
【问题讨论】:
标签: java spring-webflux project-reactor
有一个Flux<DataBuffer>。将其转换为Mono<byte[]> 的自然方式是什么?
Mono<byte[]> mergeDataBuffers(Flux<DataBuffer> flux){
// ?
}
【问题讨论】:
标签: java spring-webflux project-reactor
使用org.springframework.core.io.buffer.DataBufferUtils 将Flux<DataBuffer> 中的DataBuffers 连接成一个DataBuffer,然后将该缓冲区读入一个字节数组。
Mono<byte[]> mergeDataBuffers(Flux<DataBuffer> dataBufferFlux) {
return DataBufferUtils.join(dataBufferFlux)
.map(dataBuffer -> {
byte[] bytes = new byte[dataBuffer.readableByteCount()];
dataBuffer.read(bytes);
DataBufferUtils.release(dataBuffer);
return bytes;
});
}
这样做时请务必考虑内存使用情况,因为这种方法会将所有数据加载到内存中两次(一次在 DataBuffers 中,然后在复制到 byte[] 时再次加载)。
【讨论】:
DataBufferUtils.join(dataBufferFlux).map(dbuf -> dbuf.asByteBuffer().array())怎么样?您能否详细说明DataBufferUtils.release:我尝试了使用和不使用它,发现对内存没有明显影响(使用VisualVM)。
dataBuffer.asByteBuffer().array() 不能保证适用于所有实现,因为并非所有实现都有后备数组。当您的代码使用DataBuffer 完成时,需要调用DataBufferUtils.release,并且不再引用它。需要正确处理PooledDataBuffers 的引用计数。另见docs.spring.io/spring-framework/docs/current/reference/html/…