aboutsummaryrefslogtreecommitdiff
path: root/kamon-core/src/main/scala/kamon/ModuleSupervisor.scala
diff options
context:
space:
mode:
authorIvan Topolnjak <ivantopo@gmail.com>2015-01-12 01:45:27 +0100
committerIvan Topolnjak <ivantopo@gmail.com>2015-01-24 23:19:01 +0100
commit485abe569d23bccf2d263c82b43e59464dc7e834 (patch)
tree34dd5129afe4c4705ce80830caf8d5e48212ce39 /kamon-core/src/main/scala/kamon/ModuleSupervisor.scala
parent61089a75240f5cc21b056087f1d633dd31981c61 (diff)
downloadKamon-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.scala48
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)))
+ }
+ }
+}