据我了解,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中生成递归子actor,soley用于处理来自其他actor的特定消息?
基本上在我的“if(message.equals(”dbresponse“))”中,我想在我的ExampleActor中记录数据库响应而不是变异状态。
这种方法有效吗?像这样在飞行中创造演员的后果是什么?
答案 0 :(得分:5)
你做得恰到好处,这就是演员模型预见到演员互动的处理方式。使用ask
模式做了一些实际上相同的事情(但是产生了一个优化形式的单一回复演员),所以如果你不想使用Futures,这就是选择退出的方式。