Akka Java-动态创建递归子角色?

Akka Java-动态创建递归子角色?,java,akka,Java,Akka,据我所知,onReceive只能由一个线程在任何给定时间点执行 假设我有一个非类型演员,定义如下: import akka.actor.ActorRef; import akka.actor.Props; import akka.actor.UntypedActor; public class ExampleActor extends UntypedActor { private ActorRef databaseActor; @Override public

据我所知,onReceive只能由一个线程在任何给定时间点执行

假设我有一个非类型演员,定义如下:

import akka.actor.ActorRef;
import akka.actor.Props;
import akka.actor.UntypedActor;


public class ExampleActor extends UntypedActor {

     private ActorRef databaseActor;


    @Override
    public void preStart() {
       ActorRef databaseActor = getContext().system().actorOf(Props.create(DatabaseActor.class));
    }


    @Override
    public void onReceive(Object message) throws Exception {

        if (message.equals("start")) {
            // spawn a child actor of myself!
            ActorRef child = getContext().actorOf(Props.create(ExampleActor.class));
            databaseActor.tell("fetch", child);
        }

        if (message.equals("dbresponse")) {
           // just log the repsonse here!
        }

        if (message.equals("something else")) {
           // possibly mutate state
        }


   }
}
我基本上想使用Akka而不使用期货。同时,我希望我的演员们不要尽可能多地阻拦。在我的onReceive中生成递归子角色,单独处理来自其他角色的特定消息,可以吗

本质上,在我的“if(message.equals(“dbresponse”)”中,我只想记录一个DB响应,而不是在ExampleActor中改变状态


这种方法有效吗?像这样动态创建参与者会产生什么后果?

您做得完全正确,这就是参与者模型预测如何处理参与者交互。使用
ask
模式所做的事情实际上是相同的(但会产生一种优化形式的单一回复参与者),因此如果您不想使用Futures,这是选择退出的方式。

感谢您的回复!在Akka项目中,我们使用Patterns.ask(actor、message、timeout)方法来使用未来,但我们发现嵌套的未来(在未来的onComplete中使用Patterns.ask())会使我们的逻辑变得复杂,因为我们只想在数据库获取完成时继续,等等。何时需要使用Patterns.ask()对于通过简单的actor.tell()和相应的响应处理程序执行的IO绑定操作(DB读/写)
ask()
模式从来都不是必需的,在简单的情况下,它可以更方便地使用。一旦您要编写的参与者变得更复杂,
ask()
就不能按代码进行扩展。