Как материализованная ценность работает в Akka Stream - PullRequest
0 голосов
/ 08 февраля 2020

Я понял, что при запуске графа Akka Stream материализуется самый правый компонент.

Но при этом:

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 метод?

1 Ответ

1 голос
/ 09 февраля 2020

По умолчанию 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 вместо to и run в этом случае возвращает материализованное значение Sink, поскольку runWith сокращенный способ использования Keep.right().

Из документации :

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

runWith() - это удобный метод, который автоматически игнорирует материализованное значение любых других операторов, кроме тех, которые добавляются самим runWith(). В приведенном выше примере это означает использование Keep.right в качестве объединителя для материализованных значений.

...