2016-06-01 6 views
0

Akka-Http:アクターからの返信を返すには?私は「頼む」パターンと要求内の俳優を使用しています

val route = 
    pathPrefix("myapp") { 
     path("search") { 
     get { 
      (mainActorRef ? DoSomething("foo")).mapTo[ReturningType].map { result => 
    complete(HttpEntity(ContentTypes.`application/json`, result)) 
     } 
     } 
     } 
    } 

問題は、メインの俳優が他の俳優と通信し、このように、これらの俳優の一人から戻って答えを得ることです:

class MainActor extends Actor { 

    override def receive: Receive = { 

    case d:DoSomething => 
     anotherActor ! DoThis(d) 

    // received from anotherActor as reply to DoThis 
    case r:DoThisResponse => 
     // how do I send the response back to my “route”? 
     pipe (Future{r}) to ??? 
    } 

} 

この回答をAkka-Httpに返信するにはどうすればよいですか?

メインのアクタで「sender()」を使用すると、正しい参照ではないため、機能しません。 DoSomethingで、主役の中で "tell"(!)を使用するための参照をいくつか渡す必要がありますか?このリファレンスをどのように渡すのですか?

答えて

1

anotherActorに送信する場合、MainActortellの代わりにforwardを使用してください。そうすれば、anotherActorは送信者としてMainActorを「見る」ことはありません。

だから、基本的に、あなたはforwardと中間段階で新しいメッセージを送信するが、それは中間の俳優を見ていないので、行の俳優は、単に、senderに応答することができます。

編集:完全MainActor

class MainActor extends Actor { 

override def receive: Receive = { 

    //delegating some more work to another container 
    case d:DoSomething => 
    anotherActor forward DoThis(d) 

    // sending a response back to "route" 
    case r:DoThisResponse => 
    sender ! Response 

    } 
} 
+0

私が試したが、それは動作しません。私は前方にそれをする方法を見ることができません。 – Randomize

+0

Strange。フォワードを使用するとどうなりますか? –

+0

DoSomethingのように、何らかの時点でDoThisResponseを送信する他のアクタ内の何かを前方トリガーするものはありません。 – Randomize

関連する問題