2015-04-28 3 views
0

Я ака-нуб так извиняюсь!Akka Ask & Futures

Я играю с системой, использующей Spray и Akka. Я использую следующий фрагмент кода для отправки сообщения другому игроку. В нем используется вопрос, который, как я понял, вернет будущее, которое будет разрешено в «mapTo» и «map». Затем я возвращаю результат пользователям, использующим «полную» директиву Sprays.

val response = (worker ? Create(json)) 
      .mapTo[Ok] 
      .map(result => s"I got a response: ${result}") 
      .recover { case _ => "error" } 

complete(response) 

Мой вопрос, так как это будущее, мне нужно беспокоиться о посылке правильного ответа клиента? В некоторых примерах кода я вижу примеры, когда actorRef, чтобы ответить на пересылаются как часть запроса ...

// set reply to actor 
val replyTo = sender() // important to not close over sender() 

// create actor that collects replies from workers 
val aggregator = context.actorOf(Props(
    classOf[StatsAggregator], words.size, replyTo)) 

Тогда в принимающем актере ...

replyTo ! SendResult 

Должен ли я прохождение «replyTo» актер как часть запроса или это все позаботились в mapTo?

Заранее благодарен!

+0

Икона 'replyTo' имеет значение только в том случае, если вы отправляете сообщение в обратном вызове будущего. – Ryan

+0

Привет, Райан, спасибо за ответ. Не могли бы вы рассказать об этом немного? Как полностью знать, когда запускать и гарантировать, что он отвечает правильному клиенту с правильным сообщением? Он блокирует ??? Кроме того, скажем, в принимающем акте, он, в свою очередь, делегирует задание ребенку-актеру. Должен ли я использовать идиому «replyTo», или я могу снова использовать тот же шаблон, что и выше (mapTo), чтобы контролировать ответ? – fatlog

ответ

1

Директива complete отправит ответ на http/https-клиент вашей службы. Вам не нужно делать больше, чем это. Обратите внимание, что ваш код проглатывает ошибки, делая recover в будущем. Спрей будет считать его успешным и вернет код состояния 200.

Последнее, и самое главное, ваш рабочий должен ответить Ok сообщение назад вот так.

class Worker extends Actor { 
    def receive: Receive = { 
     case Create(json) => 
     //do some staff with json 
     sender() ! Ok // This Ok message will be passed in the future in spray route 
    } 
} 

replyTo идиома нужен только тогда, когда работник использует будущее внутри обрабатывать рабочую нагрузку. Как показан в следующем примере

class Worker extends Actor { 
    def recieve: Recieve = { 
     case Create(json) => 
      val future = Future{ 
       //do some staff with json 
      } 

      val replyTo = sender() 

      future.onComplete { 
       case scala.util.Success(result) => 
        replyTo ! Ok 
       case scala.util.Failure(ex) => 
        replyTo ! akka.actor.Status.Failure(ex)  
      } 
    } 
} 

replyTo необходим зафиксировать фактический отправитель сообщения, так как onComplete может быть выполнен в другом контексте актера, который может указывать на другой отправитель, в результате чего сообщения направляется к неправильному актеру ,

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