将自定义特征与ActorSystem混合使用

时间:2018-05-19 17:37:33

标签: scala akka

我想将自定义特征与我的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本机方法的行为,我也很感兴趣。

1 个答案:

答案 0 :(得分:0)

ActorSystemImpl是一个内部API,我强烈反对尝试扩展或直接与它进行交互,不维护内部API的二进制和源兼容性,因此忽略此建议可能会导致您的应用程序破坏补丁释放Akka或者以令人惊讶的方式行为不端。

更好的方法是在自定义Akka Extension中定义替代方法,并确保在整个代码库中使用这些方法而不是相应的内置方法。