2016-06-01 5 views
0

ich in einer Anfrage mit dem „fragen“ -Muster ein Schauspieler bin mit:Akka-Http: Wie man eine Antwort von einem Schauspieler zurückgibt?

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

Das Problem ist, dass der Hauptdarsteller mit anderen Akteuren in Verbindung steht und bekommt eine Antwort von einer jener Schauspieler wie dies zurück:

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 ??? 
    } 

} 

Wie kann ich diese Antwort als Antwort an Akka-Http senden?

Die Verwendung von "sender()" im Hauptakteur funktioniert nicht, da es nicht die richtige Referenz ist. Sollte ich in der DoSomething ein paar Hinweise zur Verwendung mit "Tell" (!) Innerhalb des Hauptdarstellers geben? Wie gebe ich diese Referenz weiter?

Antwort

1

Verwenden Sie forward anstelle von tell in der MainActor beim Senden an anotherActor. Auf diese Weise wird anotherActor als Absender MainActor nicht "sehen".

Also, im Grunde senden Sie neue Nachrichten in den Zwischenschritten mit forward, aber der Akteur in der Zeile kann einfach auf sender reagieren, da es die Zwischenakteure nicht sieht.

Edit: ein komplettes 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

Ich habe versucht, aber es funktioniert nicht. Ich kann nicht sehen, wie man es mit Forward macht. – Randomize

+0

Strange.What passiert, wenn Sie vorwärts verwenden? –

+0

Nichts, wie in DoSomething der Forward Trigger etwas in dem anderen Akteur, der irgendwann eine DoThisResponse senden wird. – Randomize

Verwandte Themen