Akka-Http: как вернуть ответ от актера?


Я использую актора внутри запроса с шаблоном "ask":

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 2

1 ответ:

Использование forward вместо tell в поле MainActor при отправке в anotherActor. Таким образом, anotherActor не будет "видеть" MainActor в качестве отправителя .

Таким образом, в основном, вы посылаете новые сообщения в промежуточных шагах с forward, но актер в линии может просто ответить на sender, так как он не видит промежуточных актеров.

Edit: a complete 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

    }
}