Akka Streams: Was bedeutet Mat in Source [out, Mat]

8

In Akka streamt, was Mat in Quelle [Out, Mat] oder Sink [In, Mat] repräsentiert. Wann wird es tatsächlich benutzt?

    
Somasundaram Sekar 27.09.2016, 14:45
quelle

1 Antwort

15

Der Parameter Mat type repräsentiert den Typ des materialisierten Wertes dieses Streams.

Denken Sie daran, dass in Akka Source , Flow , Sink (na ja, alle Graphen) nur Blaupausen sind - sie verarbeiten selbst keine Verarbeitung, sie beschreiben nur, wie der Stream aufgebaut werden soll. Die Umwandlung dieser Blaupausen in einen Arbeitsstrom mit Live-Daten wird materialisation genannt.

Die Kernmethode zum Erstellen eines Streams heißt run() und lautet definiert in der Klasse RunnableGraph . Alle anderen Methoden zum Ausführen eines Streams (z. B. runWith für Sink oder Source ) delegieren schließlich an diese Methode. Sie können sehen, dass diese Methode Mat zurückgibt. Das heißt, ein Strom materialisiert einen materialisierten Wert.

Zum Beispiel gibt es eine Senke, die alle Werte in einem Stream zu einem einzigen Wert zusammenfasst. Sie wird mit Sink.fold . 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. Es ergibt sich, dass Sink.fold Sink[In, Future[T]] zurückgibt, das heißt, dass Future[T] sein materialisierter Wert ist. Wenn Sie es materialisieren, 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 abgeschlossen, wenn der Stream ordnungsgemäß abgeschlossen wurde und mit einem Fehler abgeschlossen wird, 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 von Source.queue ist eine Warteschlange, die Sie können Verwenden Sie diese Option, um Elemente in den Stream zu schieben, sobald sie materialisiert sind. Der materialisierte Wert von Sink.actorSubscriber ist ein ActorRef , mit dem Sie mit dem Akteur interagieren können (der vom Materializer erstellt wird, wenn der Stream materialisiert wird). Auf der anderen Seite gibt es Flow.map , was ein Fluss ohne bedeutungsvollen materialisierten Wert ist (es gibt nichts, was Sie extern kontrollieren können, wenn Sie nur eine reine Funktion auf einen Stream anwenden), daher ist der materialisierte Wert NotUsed , was ist im Wesentlichen Unit .

Natürlich ist es möglich, dass verschiedene Teile des Streams ihren eigenen materialisierten Wert enthalten. Zum Beispiel verhindert nichts die Kombination von Source.queue und Sink.fold . Aber RunnableGraph.run() kann nur einen materialisierten Wert zurückgeben. Um dies zu überwinden, gibt es normalerweise zwei Varianten zum Kombinieren von Methoden für Sink s, Flow s und andere Graphen, die üblicherweise wie method und methodMat , z. to und toMat . Bei der zweiten Variante können Sie auswählen, wie die materialisierten Werte der Streams, denen Sie beitreten, kombiniert werden. Zum Beispiel können Sie sie in ein Tupel setzen, um beide zu erhalten:

%Vor%

Standardkombinationsmethoden (ohne das Mat -Suffix) wählen normalerweise entweder den linken oder den rechten materialisierten Wert, je nachdem, was am natürlichsten für diesen bestimmten Stream ist. Das Objekt Keep enthält bequeme Methoden die entweder links, rechts oder beide Argumente zurückgeben, speziell um sie als letztes Argument für *Mat Methoden zu verwenden, aber nichts hindert Sie daran, Ihre eigene Kombinationsfunktion zu schreiben.

    
Vladimir Matveev 27.09.2016, 15:49
quelle