【问题标题】:How to convert Flux of DataBuffer to Mono of byte array in Project Reactor?如何在 Project Reactor 中将 DataBuffer 的通量转换为字节数组的 Mono?
【发布时间】:2021-06-13 16:55:44
【问题描述】:

有一个Flux<DataBuffer>。将其转换为Mono<byte[]> 的自然方式是什么?

Mono<byte[]> mergeDataBuffers(Flux<DataBuffer> flux){
  // ?
}

【问题讨论】:

    标签: java spring-webflux project-reactor


    【解决方案1】:

    使用org.springframework.core.io.buffer.DataBufferUtilsFlux&lt;DataBuffer&gt; 中的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 -&gt; dbuf.asByteBuffer().array())怎么样?您能否详细说明DataBufferUtils.release:我尝试了使用和不使用它,发现对内存没有明显影响(使用VisualVM)。
    • dataBuffer.asByteBuffer().array() 不能保证适用于所有实现,因为并非所有实现都有后备数组。当您的代码使用DataBuffer 完成时,需要调用DataBufferUtils.release,并且不再引用它。需要正确处理PooledDataBuffers 的引用计数。另见docs.spring.io/spring-framework/docs/current/reference/html/…
    猜你喜欢
    • 2021-11-20
    • 2019-01-07
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 2012-02-16
    相关资源
    最近更新 更多