java - akka-spring : How to wire actors

标签 java spring akka

我正在关注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/

相关文章:

javascript - Java 属性文件到 JSON

java - Spring 启动 : ClassNotFoundException when configuring maxUploadSize of CommonMultipartResolver

java - Akka HelloAkkaJava.java 示例不工作

scala - 在不关闭系统本身的情况下停止系统中的所有参与者?

scala - 如何创建不受背压影响的 Source

java - 解决许多proguard警告

java - 如何在不使用实体类的情况下使用 EclipseLink 与表进行交互?

java - 我不明白如何使用@MapKey

java - 使用 Mockito 模拟 @Resource spring 属性

java - 模式验证 : missing table [hibernate_sequences]