2015-07-20 2 views
0

Итак, при отправке сообщения с использованием шаблона запроса (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" 

Спасибо

+0

Что означает «это не так»? –

+0

Сообщение «Получено» не доходит до источника (через временного актера). В первом случае печатается «Успех», а во втором случае «Отказ» печатается. – AlonL

+0

'sender(). Path.toSerializationFormat' возвращает' akka: // default/temp/$ a', btw – AlonL

ответ

0

Благодаря @Zernike (см. Комментарии в вопросе), мы выяснили, что в Akka 2.3.12 он работает хорошо - временный актер разрешен с использованием actorSelection. (Исходный код, вызвавший отказ, был протестирован в Akka 2.3.6)

-1

Как указано в разделе комментариев: toSerializationFormat возвращает строку формы «/ tmp/$ a».

Однако context.actorSelection требует строку с якорем пути актера. Что-то вроде формы «akka: // my-sys/...», как описано в documentation.

+0

Извините за дезинформацию. 'toSerializationFormat' (в результате чего получается' context.actorSelection', возвращает 'akka: // default/temp/$ a'. Исправлен предыдущий комментарий. – AlonL

+0

И btw,' actorSelection' не нужно полный путь к актеру, но также относительный путь, как описано в документации - http://doc.akka.io/docs/akka/snapshot/general/addressing.html#Absolute_vs__Relative_Paths – AlonL

Смежные вопросы