2

私にとって、context.parent参照はそれをしません。Play プロジェクトでは、受信した各リクエストを処理する新しいアクターを起動します。

val myActor: ActorRef = system.actorOf(Props(classOf[MyActor])

val future: Future[String] = (myActor ? Hello)(5.seconds).mapTo[String]

future.map(result => Ok(result)).recover {
  case ex: AskTimeoutException => Ok("timeout expired")
  case _ => Ok("error")
}

これにより、 の receive メソッドでより多くのアクター メッセージングがトリガーされますmyActor。 が にanotherActor応答すると、後者は親myActorにメッセージを送信します。AllGood

class MyActor extends Actor {

  // other stuff, among which setup of anotherActor

  def receive: Actor.Receive = {
    case Hallo => anotherActor ! Hello
    case HelloBack => context.parent ! AllGood
  }
}  

class AnotherActor extends Actor {
  def receive: Actor.Receive = {
    case Hallo => sender ! HelloBack
  }
}

myActorにメッセージを送信しようとするまで、すべて正常に動作しますcontext.parentdeadLettersコンソールにメッセージが表示されます。

from Actor[xyz] to Actor[akka://my-system/user] was not delivered. [1] dead letters encountered.

myActor元の への参照を保持している場合は機能させることができ、sender代わりにコードは次のようになります。

class MyActor extends Actor {

  var myDad: Option[ActorRef] = None  // <--- NEW REFERENCE

  // other stuff, among which setup of anotherActor

  def receive: Actor.Receive = {
    case Hallo => {
      myDad = Some(sender)
      anotherActor ! Hello
    }
    case HelloBack => myDad ! AllGood   <-- MYDAD INSTEAD OF CONTEXT.PARENT
  }
}  

class AnotherActor extends Actor {
  def receive: Actor.Receive = {
    case Hallo => sender ! HelloBack
  }
}

参照myDadは実際には のようなものですが、であっActor[akka://my-system/temp/$a]た と同じであると予想されます。同じ俳優じゃないの?context.parentActor[akka://my-system/user]

誰かが私にこの動作を説明し、これを修正するためのよりクリーンな方法を提案できますか? ありがとう。

4

1 に答える 1

2

親と送信者の概念を混同しているようです。

  1. context.parent [akka://my-system/user] は、アクターが を使用して Akka システムの子として作成されているため、正常ですsystem.actorOf(Props(classOf[MyActor])

  2. 送信者メソッドは、メッセージを送信したアクターを返します。ここで重要なことは次のとおりです。これは、アクターにメッセージを送信したアクター システムではありません。ask パターンを使用すると、Akka はActor[akka://my-system/temp/$a]メッセージを送信して回答を待つ一時的なアクター (この場合は ) を作成します。応答が受信されると、Future が完了します。

必要に応じて、元の送信者を転送してAnotherActor、ask パターンによって作成された一時的なアクターに直接 HelloBack を返信することができます。

これを行うには、メッセージが anotherActor に渡される方法を変更するだけです。

def receive: Actor.Receive = {
case Hallo => anotherActor.tell(Hello, sender)
}
于 2013-11-14T09:05:00.383 に答える