我想将自定义特征与我的Akka ActorSystem混合以修改其现有方法的行为。但是,由于ActorSystem是通过在ActorSystem伴随对象上调用apply方法创建的,并且实际构造函数是包私有的,所以我不能简单地将特征与构造函数混合。所以我决定在包akka.actor中编写一个新工厂(基于原始配套对象的代码see 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()
但是,根据代码(see Github),我使用了正确的类型签名。有人可以解释一下吗?
顺便说一句,如果有人知道一种更聪明的方法来改变我的ActorSystem本机方法的行为,我也很感兴趣。
答案 0 :(得分:0)
ActorSystemImpl
是一个内部API,我强烈反对尝试扩展或直接与它进行交互,不维护内部API的二进制和源兼容性,因此忽略此建议可能会导致您的应用程序破坏补丁释放Akka或者以令人惊讶的方式行为不端。
更好的方法是在自定义Akka Extension中定义替代方法,并确保在整个代码库中使用这些方法而不是相应的内置方法。