Хорошей отправной точкой является Краткое руководство по аккастриму.
Да, Actor
используется для "материализации" каждого {Source
, Flow
, Sink
} из Stream
. Это означает, что когда вы создаете поток, на самом деле ничего не происходит до тех пор, пока поток не материализуется, обычно через вызов метода .run()
.
В качестве примера, вот определяемый поток:
import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import akka.stream.scaladsl.{Source, Flow, Sink}
val stream = Source.single[String]("test")
.via(Flow[String].filter(_.size > 0))
.to(Sink.foreach{println})
Несмотря на то, что поток теперь val
, никаких вычислений на самом деле не произошло. Stream - это всего лишь рецепт для вычислений. Чтобы действительно начать работу, Stream должен быть материализован. Вот пример, в котором не используются имплициты, чтобы ясно показать, как происходит материализация:
val actorSystem = ActorSystem()
val materializer = ActorMaterializer()(actorSystem)
stream.run()(materializer) //work begins
Теперь было создано 3 Актера (как минимум): 1 для Source.single
, 1 для Flow.filter
и 1 для Sink.foreach
. Примечание: вы можете использовать тот же materializer
для запуска других потоков
val doesNothingStream = Source.empty[String]
.to(Sink.ignore)
.run()(materializer)
person
Ramón J Romero y Vigil
schedule
29.10.2015