Accessing the underlying ActorRef of an akka stream Source created by Source.actorRef

前端 未结 3 1959
情歌与酒
情歌与酒 2020-11-30 06:04

I\'m trying to use the Source.actorRef method to create an akka.stream.scaladsl.Source object. Something of the form

import akka.stream.OverflowStrategy.fai         


        
3条回答
  •  眼角桃花
    2020-11-30 06:24

    Instance of ActorRef, like all 'materialized values', will become accessible only once whole stream is materialized, or, in other words, when RunnableGraph is being run.

    // RunnableGraph[ActorRef] means that you get ActorRef when you run the graph
    val rg1: RunnableGraph[ActorRef] = sunnySource.to(Sink.foreach(println))
    
    // You get ActorRef instance as a materialized value
    val actorRef1: ActorRef = rg1.run()
    
    // Or even more correct way: to materialize both ActorRef and future to completion 
    // of the stream, so that we know when we are done:
    
    // RunnableGraph[(ActorRef, Future[Done])] means that you get tuple
    // (ActorRef, Future[Done]) when you run the graph
    val rg2: RunnableGraph[(ActorRef, Future[Done])] =
      sunnySource.toMat(Sink.foreach(println))(Keep.both)
    
    // You get both ActorRef and Future[Done] instances as materialized values
    val (actorRef2, future) = rg2.run()
    
    actorRef2 ! Weather("90210", 72.0, false)
    actorRef2 ! Weather("02139", 32.0, true)
    actorRef2 ! akka.actor.Status.Success("Done!") // Complete the stream
    future onComplete { /* ... */ }
    

提交回复
热议问题