首页 > 解决方案 > Akka Stream 中的物化值是如何工作的

问题描述

我了解到,当我运行 Akka 流图时,它将物化最正确的组件。

但是这样做:

Source.range(1,100).to(Sink.reduce((a,b) -> a+b)).run(materializer);

NotUsed尽管最左边的组件是一个返回整数的接收器,但将实现。

但是,做同样的runWith工作很好:

Source.range(1, 100).runWith(Sink.reduce((a, b) -> a + b), materializer)
                .thenAccept(value -> LOGGER.info("The final value is {}", value));

什么是我对方法不太了解run

标签: javaakkaakka-stream

解决方案


默认情况下,to保留调用该方法的流运算符的具体化值。在你的例子中......

Source.range(1, 100).to(Sink.reduce((a, b) -> a + b)).run(materializer);
//                  ^

...Source调用to,因此run在流上调用返回 的物化值Source,即NotUsed,并忽略 的物化值Sink。这相当于运行source.toMat(sink, Keep.left())

相反,在这种情况下,调用runWith而不是toandrun返回 的物化值Sink,因为runWith是使用的简写方式Keep.right()

文档中:

final CompletionStage<Integer> sum = tweets.map(t -> 1).runWith(sumSink, system);

runWith()是一种方便的方法,它自动忽略任何其他运算符的具体化值,除了由runWith()自身附加的那些。在上面的示例中,它转换为Keep.right用作物化值的组合器。


推荐阅读