diff options
author | Ivan Topolnjak <ivantopo@gmail.com> | 2015-01-12 01:45:27 +0100 |
---|---|---|
committer | Ivan Topolnjak <ivantopo@gmail.com> | 2015-01-24 23:19:01 +0100 |
commit | 485abe569d23bccf2d263c82b43e59464dc7e834 (patch) | |
tree | 34dd5129afe4c4705ce80830caf8d5e48212ce39 /kamon-core/src/main/scala/kamon/ModuleSupervisor.scala | |
parent | 61089a75240f5cc21b056087f1d633dd31981c61 (diff) | |
download | Kamon-485abe569d23bccf2d263c82b43e59464dc7e834.tar.gz Kamon-485abe569d23bccf2d263c82b43e59464dc7e834.tar.bz2 Kamon-485abe569d23bccf2d263c82b43e59464dc7e834.zip |
! all: improve the metric recorders infrastructure
Diffstat (limited to 'kamon-core/src/main/scala/kamon/ModuleSupervisor.scala')
-rw-r--r-- | kamon-core/src/main/scala/kamon/ModuleSupervisor.scala | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/kamon-core/src/main/scala/kamon/ModuleSupervisor.scala b/kamon-core/src/main/scala/kamon/ModuleSupervisor.scala new file mode 100644 index 00000000..99d87719 --- /dev/null +++ b/kamon-core/src/main/scala/kamon/ModuleSupervisor.scala @@ -0,0 +1,48 @@ +package kamon + +import _root_.akka.actor +import _root_.akka.actor._ +import kamon.ModuleSupervisor.CreateModule + +import scala.concurrent.{ Future, Promise } +import scala.util.Success + +object ModuleSupervisor extends ExtensionId[ModuleSupervisorExtension] with ExtensionIdProvider { + + def lookup(): ExtensionId[_ <: actor.Extension] = ModuleSupervisor + def createExtension(system: ExtendedActorSystem): ModuleSupervisorExtension = new ModuleSupervisorExtensionImpl(system) + + case class CreateModule(name: String, props: Props, childPromise: Promise[ActorRef]) +} + +trait ModuleSupervisorExtension extends actor.Extension { + def createModule(name: String, props: Props): Future[ActorRef] +} + +class ModuleSupervisorExtensionImpl(system: ExtendedActorSystem) extends ModuleSupervisorExtension { + import system.dispatcher + private lazy val supervisor = system.actorOf(Props[ModuleSupervisor], "kamon") + + def createModule(name: String, props: Props): Future[ActorRef] = Future {} flatMap { _: Unit ⇒ + val modulePromise = Promise[ActorRef]() + supervisor ! CreateModule(name, props, modulePromise) + modulePromise.future + } +} + +class ModuleSupervisor extends Actor with ActorLogging { + + def receive = { + case CreateModule(name, props, childPromise) ⇒ createChildModule(name, props, childPromise) + } + + def createChildModule(name: String, props: Props, childPromise: Promise[ActorRef]): Unit = { + context.child(name).map { alreadyAvailableModule ⇒ + log.warning("Received a request to create module [{}] but the module is already available, returning the existent one.") + childPromise.complete(Success(alreadyAvailableModule)) + + } getOrElse { + childPromise.complete(Success(context.actorOf(props, name))) + } + } +} |