I’m building a stream that will schedule and dispatch work with some fixed number of worker actors. I consume work in a Flow
once my Source
actor receives a message of type CanDoWork
. However, my downstream currently has no way to tell
the source that it can do work because the actor reference isn’t available when the Flow
needs to be constructed. In short, I have a “loop”.
My attempt is here:
val workTrigger: Source[CanDoWork.type, ActorRef] =
Source.actorRef(???, OverflowStrategy.dropNew)
val stream =
workTrigger
.via(Flow[CanDoWork.type].map(_ => schedulingFlow.schedule()))
.to(Sink.ignore)
lazy val dispatcher = system.actorOf(Dispatcher.props(ref))
lazy val schedulingFlow = new SchedulingFlow(dispatcher)
lazy val ref = stream.run()
As can be seen, the Dispatcher
needs a reference to the stream, which isn’t available until the stream has been created and materialized (with the dispatcher!).
How can I get this reference ahead of time? I’ve looked at mapMaterializedValue
, but it seems like that won’t do the job.