Akka Java-动态创建递归子角色?
据我所知,onReceive只能由一个线程在任何给定时间点执行 假设我有一个非类型演员,定义如下: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
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()
就不能按代码进行扩展。