如何解决Spring Webflux:使用 flatmap + Mono 下载谷歌云存储 Blob 还是只是地图?
我想在谷歌存储桶中获取一堆图片,并使用 webflux 项目将其转换为 base64。
public Flux<String> getImages() {
final Storage storage = StorageOptions.newBuilder().setProjectId(PROJECT_ID).build().getService();
Page<Blob> blobs = storage.list(BUCKET_NAME);
long startMillis = System.currentTimeMillis();
return
Flux.fromIterable(blobs.iterateAll())
.parallel()
.runOn(Schedulers.boundedElastic())
.map(blob -> blob.getContent(BlobSourceOption.generationMatch())) //blocking ? http request to google storage (returns byte[])
.map(PhotoUtils::processBytesToBase64) //non blocking
.sequential()
.doOnTerminate(() -> LOGGER.info("ELAPSED {}",System.currentTimeMillis() - startMillis));}
它有效。我使用 Blockhound 检查阻塞,但没有检测到任何内容。但是我多次阅读到任何 IO 操作(如 blob.getContent() 一样)都应该包含在平面图中。所以它会是这样的:
...
return
Flux.fromIterable(blobs.iterateAll())
.parallel()
.runOn(Schedulers.boundedElastic())
.flatMap(blob -> Mono.just(blob.getContent(BlobSourceOption.generationMatch())))
.map(PhotoUtils::processBytesToBase64)
.sequential()
.doOnTerminate(() -> LOGGER.info("ELAPSED {}",System.currentTimeMillis() - startMillis));}
但我觉得这是多余的。 哪一个是最正确的,还是我完全没有抓住重点?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。