Java 阿克卡之春:如何连接演员

Java 阿克卡之春:如何连接演员,java,spring,akka,Java,Spring,Akka,我在跟踪,但仍然不知道如何将演员注入到另一个演员中。例如: public class Reader extends UntypedConsumerActor { private ActorRef handler; public Reader(ActorRef handler) { this.handler = handler; } // ... } // Create the handler first final ActorRef hand

我在跟踪,但仍然不知道如何将演员注入到另一个演员中。例如:

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必须是Springbean。这是可能的,但我觉得不是很优雅,因为没有一种简单的方法来维护监督层次结构以及将ActorRef作为单例bean公开。起初我一直在玩这个游戏,但最终创造了很多顶级演员,这是不受欢迎的。我发现将Spring注入和ActorRef注入结合到其他参与者中最合适的方法是通过消息传递,如中所述

我的Spring服务bean是通过Spring注入的,我的ActorRef是通过消息传递注入的。由于ActorRef实际上表示的内容非常模糊,您可以将ActorRef封装在一个类中,该类还提供了一个类型,以便接收参与者可以决定如何处理它,如果他们正在执行许多不同的ActorRef注入,这一点非常重要

无论如何,回答您的问题,要创建一个Spring管理的ActorRefbean,您可以在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时,“handler”ActorRef的依赖注入就会发生。记住ActorRef是Actor的代理,这一点很重要。

如果您想使用Spring实现这一点,那么ActorRef必须是springbean。这是可能的,但我觉得不是很优雅,因为没有一种简单的方法来维护监督层次结构以及将ActorRef作为单例bean公开。起初我一直在玩这个游戏,但最终创造了很多顶级演员,这是不受欢迎的。我发现将Spring注入和ActorRef注入结合到其他参与者中最合适的方法是通过消息传递,如中所述

我的Spring服务bean是通过Spring注入的,我的ActorRef是通过消息传递注入的。由于ActorRef实际上表示的内容非常模糊,您可以将ActorRef封装在一个类中,该类还提供了一个类型,以便接收参与者可以决定如何处理它,如果他们正在执行许多不同的ActorRef注入,这一点非常重要

无论如何,回答您的问题,要创建一个Spring管理的ActorRefbean,您可以在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时,“handler”ActorRef的依赖注入就会发生。记住ActorRef是Actor的代理,这一点很重要。

此解决方案有效!但正如@nickebbitt所评论的,它不是很优雅。为什么akka没有自己的DI来与akka系统自然工作呢?嗨@KhoaNguyen。你有没有找到一个更好的方法把阿克卡和春天结合起来?正确的方法是什么?我认为将一个参与者的引用注入另一个参与者的最佳方法是通过道具使用标准构造函数注入或通过消息传递。对于服务类型类使用Spring for DI可以很好地使用文档化的示例,但对于我来说,ActorRefs不适合@nickebbitt同意的模型。这就像在圆孔里装一个方形的钉子。SpringBeans和Akka演员有不同的生命周期和范围。我最终使用了Akka模型,只有在我必须将外部服务(如DB存储库等)注入Actor时才使用Spring扩展。这个解决方案很有效!但正如@nickebbitt所评论的,它不是很优雅。为什么akka没有自己的DI来与akka系统自然工作呢?嗨@KhoaNguyen。你有没有找到一个更好的方法把阿克卡和春天结合起来?正确的方法是什么?我认为将一个参与者的引用注入另一个参与者的最佳方法是通过道具使用标准构造函数注入或通过消息传递。对于服务类型类使用Spring for DI可以很好地使用文档化的示例,但对于我来说,ActorRefs不适合@nickebbitt同意的模型。这就像在圆孔里装一个方形的钉子。SpringBeans和Akka演员有不同的生命周期和范围。我最终使用了Akka模型,只有当我必须将外部服务(如DB存储库等)注入到一个参与者中时才使用Spring扩展