2016-09-27 2 views
8

In Akka Streams was Mat in Quelle [Out, Mat] oder Sink [In, Mat] darstellt. Wann wird es tatsächlich benutzt?Akka Streams: Was bedeutet Mat in Source [out, Mat]

+2

Es repräsentiert das Konzept der Graph Materialisation. Vielleicht möchten Sie die [docs] (http://doc.akka.io/docs/akka/2.4.10/scala/stream/stream-flows-and-basics.html#Defining_and_running_streams) lesen. – hasumedic

Antwort

15

Der Typparameter repräsentiert den Typ des materialisierten Werts dieses Streams.

dass Denken Sie daran, in Akka Source, Flow, Sink (na ja, alle Grafiken) sind nur Items herzustellen - sie tun keine Verarbeitung von selbst beschreiben sie nur, wie der Strom aufgebaut werden soll. Der Prozess der Umwandlung dieser Blaupausen in einen Arbeitsstrom mit Live-Daten wird als Materialisierung bezeichnet.

Die Kernmethode zum Materialisieren eines Streams heißt run(), und es ist defined in der RunnableGraph Klasse. Alle anderen Methoden zum Ausführen eines Streams (z. B. runWith auf einem Sink oder Source) delegieren schließlich an diese Methode. Sie können sehen, dass diese Methode Mat zurückgibt. Das heißt, einen Strom materialisieren ergibt einen materialisierten Wert.

Zum Beispiel gibt es eine Senke, die alle Werte in einem Stream in einem einzigen Wert kombiniert, es wird mit Sink.fold konstruiert. Aber wie bekommen Sie diesen Wert? Da der Stream asynchron ausgeführt wird, wäre ein natürlicher Typ für diesen Wert Future[T], wobei T der Typ des Falzakkumulators ist. Stellt sich heraus, Sink.fold gibt Sink[In, Future[T]] zurück, das heißt, dieser Future[T] ist sein materialisierter Wert, daher erhalten Sie eine Instanz von Future[T], die Sie dann in Ihrem eigenen Code für die weitere Verarbeitung verwenden können: es wird mit einem Wert if abgeschlossen Der Stream wird ordnungsgemäß abgeschlossen und wird mit einem Fehler abgeschlossen, wenn der Stream mit einer Ausnahme beendet wurde.

Jeder Teil des Graphen, den Sie konstruieren, indem Sie Senken, Quellen und Flüsse (und andere Arten von Graphen) kombinieren, kann möglicherweise einen zugehörigen materialisierten Wert haben. Der materialisierte Wert Source.queue ist beispielsweise eine Warteschlange, mit der Sie Elemente in den Stream schieben können, sobald sie materialisiert sind. Der materialisierte Wert Sink.actorSubscriber ist ein ActorRef, mit dem Sie mit dem Aktor interagieren können (der vom Materializer erstellt wird) der Strom wird materialisiert). Auf der anderen Seite gibt es Flow.map, was ein Fluss ohne bedeutungsvollen materialisierten Wert ist (es gibt nichts, was Sie extern steuern können, wenn Sie nur eine reine Funktion auf einen Stream anwenden), daher ist sein materialisierter Wert NotUsed, was im Wesentlichen Unit ist.

Natürlich ist es möglich, dass verschiedene Teile des Stromes ihren eigenen materialisierten Wert enthalten. Zum Beispiel hindert Sie nichts daran, Source.queue und Sink.fold zu kombinieren. Aber RunnableGraph.run() kann nur einen materialisierten Wert zurückgeben. Um dies zu überwinden, gibt es üblicherweise zwei Varianten der Kombinationsmethoden an s, Flows und anderen Graphen, die üblicherweise als method und methodMat, z. und toMat. Die zweite Variante ermöglicht es Ihnen, zu wählen, wie materialisierte Werte der Streams kombiniert werden, die Sie verbinden. Zum Beispiel können Sie sie in ein Tupel setzen, um sie beide zu bekommen:

val (queue, future) = Source.queue[Int](10, OverflowStrategy.fail) 
    .map(x => x + 10) 
    .toMat(Sink.fold(0)(_ + _))(Keep.both) 
    .run() 

Standardkombinationsverfahren (ohne Mat Suffix) in der Regel wählen, entweder die linke oder die rechte Wert materialisiert, je nachdem, was die natürlichste wäre was man für diese besondere Art von Stream tun kann.Das Objekt Keep enthält bequeme Methoden, die entweder linke, rechte oder beide Argumente zurückgeben, speziell für den Zweck, sie als letztes Argument für die Methoden *Mat zu verwenden, aber nichts hindert Sie daran, Ihre eigene Kombinationsfunktion zu schreiben.