Я хотел бы смешать пользовательскую черту с моей Akka ActorSystem, чтобы изменить поведение существующих методов.Однако, поскольку ActorSystem создается путем вызова метода apply для объекта-компаньона ActorSystem, а фактический конструктор является частным пакетом, я не могу просто смешать черту с конструктором.Поэтому я решил написать новую фабрику в пакете akka.actor (на основе кода исходного сопутствующего объекта, см. Github ):
package akka.actor
import akka.actor.setup.ActorSystemSetup
import akka.util.Reflect
import com.typesafe.config.{ Config, ConfigFactory }
object CustomActorSystem{
def apply(){
val setup = ActorSystemSetup(BootstrapSetup(None, None, None))
val bootstrapSettings = setup.get[BootstrapSetup]
val cl = bootstrapSettings.flatMap(_.classLoader).getOrElse(Reflect.findClassLoader())
val appConfig = bootstrapSettings.flatMap(_.config).getOrElse(ConfigFactory.load(cl))
val defaultEC = bootstrapSettings.flatMap(_.defaultExecutionContext)
new ActorSystemImpl("default", appConfig, cl, defaultEC, None, setup).start() // here I could mixin my custom traits
}
}
Теперь происходит нечто странное:Компилятор жалуется на вызов конструктора:
too many arguments for constructor ActorSystemImpl: (name: String, applicationConfig: com.typesafe.config.Config, classLoader: ClassLoader, defaultExecutionContext: Option[scala.concurrent.ExecutionContext], guardianProps: Option[akka.actor.Props])akka.actor.ActorSystemImpl
[error] new ActorSystemImpl("default", appConfig, cl, defaultEC, None, setup).start()
Однако, основываясь на коде ( см. Github ), я использую правильную сигнатуру типа.Может кто-нибудь объяснить это?
И, кстати, если кто-то знает более умный способ изменить поведение нативных методов моей системы ActorSystem, я тоже заинтересован.