将Akka源转换为RxJava2可流动?

时间:2017-08-24 07:15:11

标签: java akka rx-java rx-java2

我目前正在使用以下代码将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时才运行所有内容。

谢谢!

1 个答案:

答案 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()));
}