我正在关注akka-java-spring但仍然不知道如何将 Actor 注入(inject)另一个 Actor 中。例如:
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 = ???
最佳答案
如果您想使用 Spring 来执行此操作,那么 ActorRef 必须是一个 spring bean。这是可能的,但在我看来不是很优雅,因为没有一种简单的方法来维护监督层次结构以及将 ActorRef 公开为单例 bean。我一开始就尝试过这个,但最终创建了很多顶级 Actor ,这是不可取的。我发现将 Spring 注入(inject)和 ActorRef 注入(inject)结合到其他 actor 中的最合适方法是通过消息传递,如 Akka docs 中所述。 。
我的 Spring 服务 bean 是通过 Spring 注入(inject)的,而我的 ActorRef 是通过需要时的消息传递注入(inject)的。由于 ActorRef 对于它实际代表的内容相当模糊,因此您可以将 ActoRef 包装在一个还提供类型的类中,以便接收 Actor 可以决定如何处理它,如果他们要注入(inject)许多不同的 ActorRef,则非常重要。
无论如何,回答你的问题,要创建一个 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 注释的 actor 中你会有类似的东西:
@Named("Reader")
@Scope("prototype")
public class Reader extends UntypedConsumerActor {
@Autowired
@Qualifier("handler")
private ActorRef handler;
// ...
}
当您使用 Spring 扩展创建 Reader actor 时,将会发生“处理程序”ActorRef 的依赖注入(inject)。重要的是要记住 ActorRef 是 Actor 的代理。
关于java - akka-spring : How to wire actors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26367922/