私にとって、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.parent
。deadLetters
コンソールにメッセージが表示されます。
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.parent
Actor[akka://my-system/user]
誰かが私にこの動作を説明し、これを修正するためのよりクリーンな方法を提案できますか? ありがとう。