Итак, при отправке сообщения с использованием шаблона запроса (actor ? msg
) он создает «one-off actor» за кулисами.Akka - использование actorSelection with ask pattern
Мой вопрос: есть ли возможность отправить этого временно действующего лица с помощью actorSelection
?
Например, следующий код работает хорошо:
object Test extends App {
case class WrappedMsg(msg: String, replyTo: ActorRef)
class Source(target: ActorRef) extends Actor {
def receive = { case _ => } // doesn't matter
implicit val execution = context.dispatcher
implicit val timeout = Timeout(5.seconds)
val middleware = context.actorOf(Props(new Middleware(target)))
(middleware ? "Something").mapTo[String].onComplete {
case Success(msg) => println("Success: " + msg)
case Failure(err) => println("Failure: " + err)
}
}
class Middleware(target: ActorRef) extends Actor {
def receive = {
case msg: String =>
val wrappedMsg = WrappedMsg(replyTo = sender(), msg = msg)
target ! wrappedMsg
}
}
class Target extends Actor {
def receive = {
case wrappedMsg: WrappedMsg => wrappedMsg.replyTo ! "Received"
}
}
val system = ActorSystem()
val target = system.actorOf(Props(new Target))
val source = system.actorOf(Props(new Source(target)))
}
Но, если я внести следующие изменения для того, чтобы использовать актер URL вместо ActorRef, он не:
case class WrappedMsg(msg: String, replyTo: String)
...
val wrappedMsg = WrappedMsg(replyTo = sender().path.toSerializationFormat, msg = msg)
...
case wrappedMsg: WrappedMsg => context.actorSelection(wrappedMsg.replyTo) ! "Received"
Спасибо
Что означает «это не так»? –
Сообщение «Получено» не доходит до источника (через временного актера). В первом случае печатается «Успех», а во втором случае «Отказ» печатается. – AlonL
'sender(). Path.toSerializationFormat' возвращает' akka: // default/temp/$ a', btw – AlonL