2014-05-08 23 views
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狀態。

此方法是否有效?這樣創造演員的後果是什麼?

回答

4

您正在做的完全正確,這是Actor模型如何處理演員互動。使用ask模式可以做到實際上相同的事情(但會產生一種優化的單一回復行爲者形式),所以如果您不想使用Futures,則可以選擇退出。

+0

感謝您的迴應!我們通過使用Patterns.ask(actor,message,timeout)方法在我們的Akka項目中使用Futures,但是我們發現,隨着未來的onComplete中的嵌套期貨(使用Patterns.ask()),我們的邏輯變得複雜)soley,因爲我們只想在數據庫讀取完成時繼續進行等等。何時需要使用Patterns.ask()進行IO綁定操作(DB讀取/寫入),通過簡單的actor.tell()以及相應的響應處理程序? – HiChews123

+1

'ask()'模式從來沒有必要,它可以在簡單的情況下使用起來更方便。只要你寫的演員變得更復雜,'ask()'不會按代碼進行擴展。 –