2016-12-13 54 views
5

Próbuję zrozumieć typ źródła dla strumieni Akka, określony here.Co oznaczają parametry typu dla źródła <Out,Mat>?

Niestety, dokumentacja i przykłady, które znalazłem, nie wyjaśniają, co właściwie oznaczają poszczególne parametry. Zgaduję, że Out jest typem, który źródło emituje po zmaterializowaniu. Czy to jest poprawne? Jaki jest inny parametr typu Mat?

Odpowiedz

6

Out

Masz rację, to jest rodzaj elementów, które są emitowane przez Source.

Mat

Jest to rodzaj materializacji Source „s. Zwróć uwagę, że każdy etap (Flow s, Sink s itp.) Również zostanie zmaterializowany. Jest to zasadniczo produkt uboczny samego etapu po jest uruchamiany.

Można to sobie wyobrazić jako środek interakcji ze sceną podczas jej działania. Patrzenie na przykłady gotowych Source oferowanych przez Akka jest dobrym sposobem na zrozumienie tego.

  • Source.single zostaną zrealizowane do NotUsed. Nie masz zamiaru wchodzić w interakcje ze źródłem, ponieważ od razu wyprodukuje tylko jeden element, a następnie ukończy.

  • Source.queue zmaterializuje się na SourceQueue. Jest to bardziej interesujący przypadek, ponieważ możesz komunikować się ze źródłem przez komunikaty do niego. Wiadomości będą emitowane przez źródło.

  • Source.maybe zmaterializuje się na Promise. Możesz użyć kontrolki Promise, aby emitować jeden element lub None.

Po połączeniu różnych etapów należy pamiętać, że każdy etap może mieć potencjalnie użyteczną wartość zmaterializowaną. Możesz wybrać, które z nich zachować, używając DSL viaMat/toMat i Keep. Jedna lub więcej zmaterializowanych wartości zostanie zwrócona po wywołaniu run() na skomponowanym wykresie.

przyjrzeniu typów w poniższych przykładach jest najlepszym sposobem, aby dostać sens API:

val source: Source[Int, MatSrc] 
    val sink: Sink[Int, MatSnk] 

    val matSrc: MatSrc = source.toMat(sink)(Keep.left).run() 
    val matSnk: MatSnk = source.toMat(sink)(Keep.right).run() 
    val (m1: MatSrc, m2: MatSnk) = source.toMat(sink)(Keep.both).run() 
    val n: NotUsed = source.toMat(sink)(Keep.none).run() 

Uwaga że bardziej zwięzłe DSL, które można znaleźć w wielu przykład jest rzeczywiście skrót dla powyższego, gdzie zachowana jest tylko zmaterializowana wartość ostatniego etapu (np. zlew).

val mat3: Mat3 = source.viaMat(flow)(Keep.right).toMat(sink)(Keep.right).run() 

jest taka sama jak

val mat3: Mat3 = source.via(flow).runWith(sink) 

Zobacz docs poniżej do dalszego czytania.

http://doc.akka.io/docs/akka/2.4/java/stream/stream-quickstart.html#Materialized_values