All Downloads are FREE. Search and download functionalities are using the official Maven repository.

akka.discovery.ServiceDiscovery.scala Maven / Gradle / Ivy

/*
 * Copyright (C) 2017 Lightbend Inc. 
 */
package akka.discovery

import akka.actor._
import akka.event.Logging
import com.typesafe.config.{ Config, ConfigException, ConfigRenderOptions }

final class ServiceDiscovery(implicit system: ExtendedActorSystem) extends Extension {
  private val log = Logging(system, getClass)

  private implicit class HasDefined(val config: Config) {
    def hasDefined(key: String): Boolean =
      config.hasPath(key) &&
      config.getString(key).trim.nonEmpty &&
      config.getString(key) != s"<$key>"
  }

  private lazy val _simpleImplMethod =
    system.settings.config.getString("akka.discovery.method") match {
      case "" ⇒
        throw new IllegalArgumentException("No default service discovery implementation configured in " +
          "`akka.discovery.method`. Make sure to configure this setting to your preferred implementation such as 'akka-dns' in your application.conf (from the akka-discovery-dns module).")
      case method ⇒ method
    }

  private lazy val _simpleImpl = {
    val config = system.settings.config
    val dynamic = system.dynamicAccess

    def classNameFromConfig(path: String): String =
      if (config.hasPath(path)) config.getString(path)
      else ""

    def create(clazzName: String) =
      dynamic
        .createInstanceFor[SimpleServiceDiscovery](clazzName, (classOf[ExtendedActorSystem] → system) :: Nil)
        .recoverWith {
          case _ ⇒
            dynamic.createInstanceFor[SimpleServiceDiscovery](_simpleImplMethod,
              (classOf[ActorSystem] → system) :: Nil)
        }
        .recoverWith {
          case _ ⇒
            dynamic.createInstanceFor[SimpleServiceDiscovery](_simpleImplMethod, Nil)
        }

    val i = create("akka.discovery." + _simpleImplMethod + ".class").recoverWith {
      case _ ⇒ create(_simpleImplMethod + ".class")
    }.recoverWith { case _ ⇒ create(_simpleImplMethod) }

    i.getOrElse(
      throw new IllegalArgumentException(
          s"Illegal `akka.discovery.impl` value (${_simpleImplMethod}) or incompatible class! " +
          "The implementation class MUST extend akka.discovery.SimpleServiceDiscovery and take an ExtendedActorSystem as constructor argument.",
          i.failed.get)
    )
  }

  /**
   * Default [[SimpleServiceDiscovery]] as configured in `akka.discovery.method`.
   *
   * Could throw an [[IllegalArgumentException]] if the configured implementation class is illegal.
   */
  // FIXME better name?
  def discovery: SimpleServiceDiscovery = _simpleImpl

}

object ServiceDiscovery extends ExtensionId[ServiceDiscovery] with ExtensionIdProvider {
  override def apply(system: ActorSystem): ServiceDiscovery = super.apply(system)
  override def lookup: ServiceDiscovery.type = ServiceDiscovery

  override def get(system: ActorSystem): ServiceDiscovery = super.get(system)

  override def createExtension(system: ExtendedActorSystem): ServiceDiscovery = new ServiceDiscovery()(system)

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy