据我了解,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
}
}
}
Run Code Online (Sandbox Code Playgroud)
我本质上是想使用Akka而不使用期货。同时,我希望我的演员不要尽可能多地阻止。是否可以在我的onReceive,soley中生成递归子角色以处理来自其他角色的特定消息?
本质上,在我的“ if(message.equals(“ dbresponse”))”中,我只想记录数据库响应,而不是在ExampleActor中更改状态。
这种方法行得通吗?像这样即时创建演员的后果是什么?
您所做的完全正确,这就是Actor模型预见到Actor交互的处理方式。使用该ask模式实际上可以实现相同的功能(但是会生成优化形式的单答复角色),因此,如果您不想使用Futures,则可以选择退出。
| 归档时间: |
|
| 查看次数: |
2051 次 |
| 最近记录: |