Смешайте пользовательскую черту с ActorSystem - PullRequest
0 голосов
/ 19 мая 2018

Я хотел бы смешать пользовательскую черту с моей 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, я тоже заинтересован.

1 Ответ

0 голосов
/ 25 мая 2018

ActorSystemImpl является внутренним API, и я бы настоятельно не рекомендовал пытаться расширять его или взаимодействовать с ним напрямую, двоичная и исходная совместимость не поддерживается для внутренних API, поэтому игнорирование этого совета может привести к сбою приложения в выпусках исправленийAkka или просто нехорошее поведение в целом удивительным образом.

Лучшим способом было бы определить альтернативные методы в пользовательском Расширении Akka и убедиться, что вы используете их во всей кодовой базе вместо соответствующихвстроенные методы.

...