akka-spring:如何连接演员

时间:2014-10-14 18:36:34

标签: java spring akka

我关注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 = ???

1 个答案:

答案 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的代理。