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 ответ:
Использование
Таким образом, в основном, вы посылаете новые сообщения в промежуточных шагах с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 } }