aboutsummaryrefslogtreecommitdiff
path: root/kamon-core/src/main/scala/kamon/ModuleSupervisor.scala
diff options
context:
space:
mode:
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)))
+ }
+ }
+}