Skip to content

Instantly share code, notes, and snippets.

@kevinwright
Last active August 29, 2015 14:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save kevinwright/0a9e64f26ba734c55bf5 to your computer and use it in GitHub Desktop.
Save kevinwright/0a9e64f26ba734c55bf5 to your computer and use it in GitHub Desktop.
Sending to an actor you don't know yet...
import akka.actor._
import scala.collection.mutable
case class DeferredActorRef(implicit factory: ActorRefFactory) {
private[this] val innerActor = factory.actorOf(Props(new TheActor))
private[this] case class SetRef(ref: ActorRef)
private[this] class TheActor extends Actor with ActorLogging {
val buffer: mutable.Queue[(Any, ActorRef)] = mutable.Queue.empty
override def receive: Receive = {
case SetRef(ref) =>
buffer foreach { case (msg, snd) =>
// log.info(s"de-queuing to ${ref.path.name}: $msg")
ref.!(msg)(snd)
}
buffer.clear()
context become receive2(ref)
case msg =>
// log.info(s"queuing: $msg")
buffer enqueue (msg -> context.sender())
}
def receive2(ref: ActorRef): Receive = {
case msg =>
// log.info(s"sending direct to ${ref.path.name}: $msg")
ref forward msg
}
}
def !(msg: Any)(implicit ctx: ActorContext) = innerActor ! msg
def forward(msg: Any)(implicit ctx: ActorContext) = innerActor forward msg
def set(ref: ActorRef) = innerActor ! SetRef(ref)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment