in src/main/scala/com/twitter/scaffold/InterpreterSupervisor.scala [14:43]
private[this] def supervisor(id: String): Cancellable =
context.system.scheduler.scheduleOnce(idleTimeout, self, Destroy(id))
def receive = {
case Create =>
val id = randomId()
val interpreter = context.actorOf(Interpreter.props, s"interpreter-$id")
interpreters += id -> new SupervisedInterpreter(interpreter, supervisor(id))
sender ! Created(id)
case Destroy(id) =>
interpreters.remove(id) match {
case Some(supervisedInterpreter) =>
supervisedInterpreter.interpreter ! PoisonPill
supervisedInterpreter.supervisor.cancel()
sender ! Destroyed
case None =>
sender ! NoSuchInterpreter
}
case Request(id, request) =>
interpreters.get(id) match {
case Some(supervisedInterpreter) =>
supervisedInterpreter.interpreter.forward(request)
supervisedInterpreter.supervisor.cancel()
supervisedInterpreter.supervisor = supervisor(id)
case None =>
sender ! NoSuchInterpreter
}
}