Akka Java - 如何动态地创建递归子Actor?

5

我理解onReceive只能在任何给定时间点上由一个线程执行。

假设我定义了一个未经类型化的actor,如下所示:

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
        }


   }
}

我想在不使用futures的情况下使用Akka。同时,我希望我的actors尽可能地不阻塞。在我的onReceive中,仅用于处理其他actors特定消息的目的,是否可以生成递归的子actors?

在我的"if (message.equals("dbresponse"))"中,我只想记录一个数据库响应而不是改变我的ExampleActor的状态。

这种方法可行吗?像这样动态创建actors有什么后果?

1个回答

5

你做得非常正确,这正是Actor模型预见到处理actor交互的方式。使用ask模式会执行同样的操作(但是会生成优化的单回复Actor形式),因此如果你不想使用Futures,这就是退出的方式。


谢谢您的回复!我们在Akka项目中使用Futures,通过使用Patterns.ask(actor, message, timeout)方法。但是,我们发现当我们需要等待DB读取完成等操作时,嵌套的Futures(在一个future的onComplete中使用Patterns.ask())会使我们的逻辑变得复杂。那么,在IO绑定操作(如DB读/写)中何时需要使用Patterns.ask()而不是简单的actor.tell()和相应的响应处理程序呢? - HiChews123
1
“ask()”模式并不是必需的,仅在简单情况下使用更方便。一旦您编写的Actor变得更加复杂,“ask()”在代码方面的可扩展性就会降低。 - Roland Kuhn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接