我使用Play Framework,Akka和Guice。需要简单地将一些服务(或另一个actor)注入一个由注入某个控制器的路由器创建的actor。
我有一个路由器配置:
akka.actor.deployment {
/job-router {
router = "round-robin-pool"
nr-of-instances = 10
}
}
绑定此路由器的模块
class ComponentModule extends AbstractModule with AkkaGuiceSupport {
def configure() ={
bindActor[JobActor]("job-router",(p: Props) => FromConfig.props(JobActor.props))
}
}
演员,注入另一个路由器
class JobActor @Inject() (@Named("b-router")bRouter: ActorRef) extends Actor {
def this() = {
this(null)
}
override def receive = {
case SayHello(name: String) => {
println(bRouter)
sender() ! "hello,"+name
}
}
}
object JobActor {
def props = Props[JobActor].withDispatcher("akka.actor.default-dispatcher")
}
但是不是注入b-router
,而是调用没有参数的构造函数,所以我不能简单地将b-router
加入到RoundRobinPool的routee中。
我明白儿童演员(比如说Actor[akka://application/user/job-router/$a#-22311049]
)并不是由Guice直接注入的,只是想知道是否有简化的方式来做这件事。
由于实际的routee job-router/$a#-22311049
是RoundRobinPool的孩子,我是实施RoundRobinPool注入并将其传递给routee的最佳做法吗?
这可以用来注射演员:
context.actorSelection("akka://application/user/b-router")
关于Guice注入的其他服务?
暂时解决,注入另一个"顶级"演员(dao-provider-actor
):
lazy val dao=Await.result((context.actorSelection("/user/dao-provider-actor") ? GetXDao).mapTo[XDAO],10.milliseconds)