4
這是我的理解,onReceive只能在任何給定的時間點執行一個線程。Akka Java - 隨時創建遞歸的小孩演員?
比方說,我有一個這樣定義的類型化的演員:
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
}
}
}
我基本上是想用阿卡不使用期貨。同時,我希望我的演員不要儘可能地阻止。是否可以在我的onReceive中產生遞歸子actor,從而處理來自其他actor的特定消息?我基本上在我的「if(message.equals(」dbresponse「)))」,我只想在我的ExampleActor中記錄一個數據庫響應,而不是mutate狀態。
此方法是否有效?這樣創造演員的後果是什麼?
感謝您的迴應!我們通過使用Patterns.ask(actor,message,timeout)方法在我們的Akka項目中使用Futures,但是我們發現,隨着未來的onComplete中的嵌套期貨(使用Patterns.ask()),我們的邏輯變得複雜)soley,因爲我們只想在數據庫讀取完成時繼續進行等等。何時需要使用Patterns.ask()進行IO綁定操作(DB讀取/寫入),通過簡單的actor.tell()以及相應的響應處理程序? – HiChews123
'ask()'模式從來沒有必要,它可以在簡單的情況下使用起來更方便。只要你寫的演員變得更復雜,'ask()'不會按代碼進行擴展。 –