我目前正在使用以下代码将Akka源(例如使用Akka&#39s的FileIO读取文件)转换为RxJava2 Flowable:
private Flowable<Buffer> akkaConversion(Source<ByteString, NotUsed> data,
Flow<ByteString, ByteString, NotUsed> compType) {
final Publisher<ByteString> uncompressedData =
data.via(compType)
.runWith(Sink.asPublisher(AsPublisher.WITHOUT_FANOUT), this.materializer);
return Flowable.fromPublisher(uncompressedData)
.map(bytes -> Buffer.buffer(bytes.toArray()));
}
我对这个(工作)解决方案的问题是,至少就我目前所理解的而言,.runWith()
方法调用已经运行了代码,即收集来自给定Source的所有数据,缓冲它然后将其放入发布者。有没有办法在这一点上运行它?我想在没有物化器的情况下定义转换,并且只有在稍后订阅Flowable时才运行所有内容。
谢谢!
答案 0 :(得分:2)
使用延迟(旁注:我必须多次这样做,因为Akka Sources是一次拍摄):
private Flowable<Buffer> akkaConversion(Source<ByteString, NotUsed> data,
Flow<ByteString, ByteString, NotUsed> compType) {
return Flowable.defer(() -> data.via(compType)
.runWith(Sink.asPublisher(AsPublisher.WITHOUT_FANOUT), this.materializer)
).map(bytes -> Buffer.buffer(bytes.toArray()));
}