вводить актеров akka используя guice в игре 2.5 - PullRequest
0 голосов
/ 26 июня 2018

В Play 2.2 я создал класс GlobalActorProducer

import akka.actor.{Props, IndirectActorProducer, Actor}
import play.api.Play

class GlobalActorProducer[T <: Actor](val aClass: Class[T]) extends IndirectActorProducer {

  def produce(): T = Play.current.global.getControllerInstance(aClass)

  def actorClass: Class[T] = aClass
}

object GlobalActorProducer {
  def apply[T <: Actor](targetClass: Class[T]): Props = Props.create(classOf[GlobalActorProducer[T]], targetClass)
}

Я хочу обновить Play Framework до 2.5.Play.current устарела в play 2.5, поэтому я изменил этот класс с помощью Injector, но инжектор всегда равен Null.Как мне заставить этот класс работать в игре 2.5?

import akka.actor.{Props, IndirectActorProducer, Actor}
import javax.inject.Inject
import com.google.inject.Injector

class GlobalActorProducer[T <: Actor](val aClass: Class[T]) extends IndirectActorProducer {

  @Inject private var injector : Injector = _

 def produce(): T = injector.getInstance(aClass)

  def actorClass: Class[T] = aClass
}

object GlobalActorProducer {
  def apply[T <: Actor](targetClass: Class[T]): Props = Props.create(classOf[GlobalActorProducer[T]], targetClass)
}

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Вы хотите использовать поддержку Akka Guice, предоставляемую Play, в пространстве имен play.api.libs.concurrent.AkkaGuiceSupport, как описано в Актеры внедрения зависимостей .

Play предоставляет несколько помощников, которые помогают связывать актеров. Это позволяет самому субъекту быть внедренным зависимостью, и позволяет актору ref для актера быть внедренным в другие компоненты. Чтобы связать актера с помощью этих помощников, создайте модуль, как описано в документации по внедрению зависимостей, затем добавьте черту AkkaGuiceSupport и используйте метод bindActor для привязки актера:

import com.google.inject.AbstractModule
import play.api.libs.concurrent.AkkaGuiceSupport

import actors.ConfiguredActor

class MyModule extends AbstractModule with AkkaGuiceSupport {
  def configure = {
    bindActor[ConfiguredActor]("configured-actor")
  }
}

@Singleton
class Application @Inject() (@Named("configured-actor") configuredActor: ActorRef, components: ControllerComponents)
                            (implicit ec: ExecutionContext) extends AbstractController(components) {

  implicit val timeout: Timeout = 5.seconds

  def getConfig = Action.async {
    (configuredActor ? GetConfig).mapTo[String].map { message =>
      Ok(message)
    }
  }
}
0 голосов
/ 26 июня 2018

Инъекция Actor с - плохая практика. ActorRef создаются системой акторов особым образом, не подвергая действительный объект, вместо этого выставляя ActorRef (дескриптор).

Решение:

Идея состоит в том, чтобы ввести ActorSystem, а затем создать актеров, используя

actorSystem.actorOf

...