我关注akka-java-spring但仍然不知道如何在另一个人中注入演员。例如:
public class Reader extends UntypedConsumerActor {
private ActorRef handler;
public Reader(ActorRef handler) {
this.handler = handler;
}
// ...
}
// Create the handler first
final ActorRef handler = getContext()
.actorOf(SpringExtProvider.get(system).props("Handler"), "handler");
// Now how do I pass the handler above to the Reader ???
final ActorRef reader = ???
答案 0 :(得分:4)
如果你想用Spring做这个,那么ActorRef必须是一个spring bean。这是可能的,但不是很优雅,因为没有一种简单的方法来维护监督层次结构以及将ActorRef暴露为单例bean。我一开始就玩这个,但结果却产生了许多不受欢迎的顶级演员。我发现将Spring注入和ActorRef注入组合到其他actor中的最合适的方法是通过Akka docs中描述的消息传递。
我的Spring服务bean是通过Spring注入的,我的ActorRef是通过需要的消息传递注入的。由于ActorRef对于它实际代表的含义非常模糊,你可以将ActoRef包装在一个类中,该类也提供一种类型,这样接收角色可以决定如何处理它,非常重要的是如果他们正在注入许多不同的ActorRef被注入。 / p>
无论如何,回答你的问题,要创建一个Spring托管的ActorRef bean,你可以在Spring @Configuration类中执行以下操作:
@Autowired
private ActorSystem actorSystem;
@Bean(name = "handler")
public ActorRef handler() {
return actorSystem.actorOf(SpringExtProvider.get(system).props("Handler"), "handler");
}
然后在你的Spring注释演员中,你会有类似的东西:
@Named("Reader")
@Scope("prototype")
public class Reader extends UntypedConsumerActor {
@Autowired
@Qualifier("handler")
private ActorRef handler;
// ...
}
使用Spring扩展创建Reader actor时,将发生“handler”ActorRef的依赖注入。重要的是要记住ActorRef是Actor的代理。