scala akka streaming akka-stream

scala - corriente akka toMat



streaming akka-stream (2)

  1. via es solo un atajo para viaMat (...) (Keep.left), y de hecho así es como se implementa: override def via[T, Mat2](flow: Graph[FlowShape[Out, T], Mat2]): Repr[T] = viaMat(flow)(Keep.left)

  2. toMat es el mismo que viaMat pero para los sumideros, le permite mantener el valor materializado desde el lado izquierdo (fuente / flujo) o derecho (sumidero) o ambos

  3. Keep.both es solo un alias para (a:A,b:B) => (a, b) , que es una función que toma los dos parámetros de entrada y los devuelve como una tupla. Se usa para tener el valor materializado del lado izquierdo y derecho cuando se combinan dos flujos (o fuente y flujo o flujo y sumidero, etc.)

Diseccionaré tu línea de código:

// you''re keeping the materialized value of flow val source2 = Source (1 to 10).viaMat(flow)(Keep.right) // you''re keeping both materialized values, i.e. the one of flow from previous step // and the one o sink. val runnableGraph = source2.toMat(sink)(Keep.both) runnableGraph.run() // returns a tuple (flowMatVal, sinkMatVal)

Cuando se unen dos partes de un flujo (es decir, fuente y flujo / sumidero o flujo y sumidero), cada una de ellas tiene un valor materializado que se obtiene cuando se ejecuta el flujo. El comportamiento predeterminado cuando se combina con via / to es mantener el lado izquierdo. Si utiliza viaMat / toMat, puede optar por mantener el valor materializado correcto o ambos como una tupla.

Estoy tratando de entender lo que hace toMat en la transmisión de akka. Por ejemplo:

val sink1:Sink[Int, Future[Int]]=Sink.fold[Int,Int](0)(_ + _) val flow=Flow[Int].fold[Int](0){(x,y)=> x+y} val runnable = Source (1 to 10).viaMat(flow)(Keep.right).toMat(sink1)(Keep.both)

  1. ¿Qué es el uso de viaMat vs via?
  2. ¿Qué está haciendo toMat entre viaMat y toMat?
  3. ¿Cuál es el uso de keep.both? ¿Significa que puedo materializar el valor anterior y el actual, si es así, cómo puedo recuperar esos valores?

Gracias arun