В моем проекте я должен использовать актеров и планировщиков. Все мои потребности могут быть выполнены с использованием только одной системы акторов. Но мне нужны планировщики и актеры более чем в одном классе. Итак, мой вопрос: если я должен внедрить акторную систему в каждый класс, как показано ниже, будет ли это создавать только одну акторную систему или более одной? Я не хочу создавать более одной системы акторов, так как это не рекомендуется.
import akka.actor.ActorSystem
@Singleton
class someClass @Inject()(actorSystem: ActorSystem){....} // abstract class ActorSystem extends ActorRefFactory
@Singleton
class anotherClass @Inject()(actorSystem: ActorSystem){....}
Или я должен создать еще один объект и объявить в нем акторную систему и использовать ее везде, например:
import akka.actor._
object actorSystemObject {
val system: ActorSystem = ActorSystem()
}
Какой метод будет лучше и стандартнее?





Предполагая, что вы используете guice, попробуйте предоставление a синглтон вот так
@Provides
@Singleton
def getActorSystem: ActorSystem = ActorSystem()
Например
import akka.actor.ActorSystem
import com.google.inject.{AbstractModule, Guice, Inject, Injector, Provides, Singleton}
import scala.jdk.CollectionConverters._
class MyModule extends AbstractModule {
@Provides
@Singleton
def getActorSystem: ActorSystem = ActorSystem()
}
@Singleton
class SomeClass @Inject()(actorSystem: ActorSystem) {
println(actorSystem.hashCode())
}
@Singleton
class SomeOtherClass @Inject()(actorSystem: ActorSystem) {
println(actorSystem.hashCode())
}
object Hello extends App {
val injector: Injector = Guice.createInjector(List(new MyModule).asJava)
injector.getInstance(classOf[SomeClass])
injector.getInstance(classOf[SomeOtherClass])
}
который выводит что-то вроде
1731656333
1731656333
где мы видим, что один и тот же ActorSystem вводится, как очевидно, одним и тем же hashCode.
Скажем, мы удаляем @Singleton провайдера вот так
@Provides
def getActorSystem: ActorSystem = ActorSystem()
то hashCode отличаются, например,
2050462663
1117871068
Конечно, лучше избегать глобальных объектов, вместо этого использовать некоторую форму внедрения зависимостей.