2016-08-14 13 views
0

私はこれを尋ねることは大丈夫です。私はakkaを使用していて、2人のアクターを持っています。そこでは、1つは開始/作成され、もう一方ははるかに遅くなります。急速に作成されたものは、他の人に何か(ask-pattern)を求め、メッセージはまだ開始されていないので、デッドレターに送られます。俳優がメッセージを送って待っているようにするための好ましい方法は何ですか?私は他の方法がないことを知らずに俳優の睡眠や何かを作ることを熱望していません。まだ作成されていないアクターにメッセージを送信しないようにするにはどうすればよいですか?

答えて

1

私は機能を使用しますbecome()/unbecome()アクカーはアクターのために提供します。次のコードでslowActorfastActorによって作成されると仮定しています。ここでのトリックは、が開始されているときと、何らかの作業を行う準備ができているときの2つのふるまいがfastActorにあることです。 slowActorが準備完了すると、fastActorにメッセージを送信し、メッセージを受信できることを通知します。 fastActorはとなり、終了した場合は再び動作を変更します。次に何をするかは、あなたの解決策になります。ここで

はガイドとしてモックコードは(私は、コードをコンパイルしていないと、それは多少の誤差が含まれる可能性があります)です。

case object Ready 
case object DoWork 
case object WorkDone 

class FastActor extends Actor with ActorLogging { 

    val slowActor = context.actorOf(SlowActor.props) 
    context.watch(slowActor) 

    def receive = slowActorNotReadyBehavior 

    def slowActorNotReadyBehavior = { 
     case DoWork => log.warning("Slow actor in not ready, I am sorry...") 
     case Ready => context.become(slowActorReadyBehavior) 
    } 

    def slowActorReadyBehavior = { 
     case DoWork => (slowActor ? DoWork).pipeTo(self) 
     case Terminated(ref) => 
      log.error("Slow actor terminated") 
      context.unbecome() 
      //... do something with slowActor 
    } 
} 

class SlowActor extends Actor { 

    override def preStart = { 
     context.parent ! Ready 
    } 

    def receive = { 
     case DoWork => 
      //do something 
      sender ! WorkDone 
    } 
} 
+0

感謝。興味深いかもしれませんが、遅い俳優は今のところ俳優の兄弟です。 – stian

関連する問題