in management/src/main/scala/org/apache/pekko/management/scaladsl/PekkoManagement.scala [243:301]
private def loadRouteProviders(): immutable.Seq[ManagementRouteProvider] = {
val dynamicAccess = system.dynamicAccess
// since often the providers are Pekko extensions, we initialize them here as the ActorSystem would otherwise
settings.Http.RouteProviders.map {
case NamedRouteProvider(name, fqcn) =>
dynamicAccess
.getObjectFor[ExtensionIdProvider](fqcn)
.recoverWith {
case _ => dynamicAccess.createInstanceFor[ExtensionIdProvider](fqcn, Nil)
}
.recoverWith[ExtensionIdProvider] {
case _: ClassCastException | _: NoSuchMethodException =>
dynamicAccess.createInstanceFor[ExtensionIdProvider](fqcn, (classOf[ExtendedActorSystem], system) :: Nil)
}
.recoverWith[AnyRef] {
case _: ClassCastException | _: NoSuchMethodException =>
dynamicAccess.createInstanceFor[ManagementRouteProvider](fqcn, Nil)
}
.recoverWith[AnyRef] {
case _: ClassCastException | _: NoSuchMethodException =>
dynamicAccess.createInstanceFor[ManagementRouteProvider](
fqcn,
(classOf[ExtendedActorSystem], system) :: Nil)
}
.recoverWith[AnyRef] {
case _: ClassCastException | _: NoSuchMethodException =>
dynamicAccess.createInstanceFor[javadsl.ManagementRouteProvider](fqcn, Nil)
}
.recoverWith[AnyRef] {
case _: ClassCastException | _: NoSuchMethodException =>
dynamicAccess
.createInstanceFor[javadsl.ManagementRouteProvider](fqcn, (classOf[ExtendedActorSystem], system) :: Nil)
} match {
case Success(p: ExtensionIdProvider) =>
system.registerExtension(p.lookup) match {
case provider: ManagementRouteProvider => provider
case provider: javadsl.ManagementRouteProvider => new ManagementRouteProviderAdapter(provider)
case other =>
throw new RuntimeException(
s"Extension [$fqcn] should create a 'ManagementRouteProvider' but was " +
s"[${other.getClass.getName}]")
}
case Success(provider: ManagementRouteProvider) =>
provider
case Success(provider: javadsl.ManagementRouteProvider) =>
new ManagementRouteProviderAdapter(provider)
case Success(_) =>
throw new RuntimeException(
s"[$fqcn] is not an 'ExtensionIdProvider', 'ExtensionId' or 'ManagementRouteProvider'")
case Failure(problem) =>
throw new RuntimeException(s"While trying to load route provider extension [$name = $fqcn]", problem)
}
}
}