Должен ли актер Akka различать, ожидается ли возвращаемое будущее после передачи сообщения? - PullRequest
0 голосов
/ 02 февраля 2012

Насколько я понимаю, актеру может быть отправлено сообщение «Зажги и забудь» в стиле!оператор или стиль "Отправь и получи в будущем" с помощью?оператор.Актер, которому передается сообщение через?должен вызвать self.reply, иначе отправитель получит исключение тайм-аута.С другой стороны, актер, которому передается сообщение через!не может иметь self.reply, если сообщение не передается от другого актера.

Мой вопрос заключается в том, должен ли актер знать во время компиляции, будет ли оно вызвано!или же ????Или, если необходимость self.reply может быть определена во время выполнения, как это можно определить?Возможно, задействован self.tryReply, но документация akka, по-видимому, подразумевает, что неудачная попытка ответить является ошибкой, в то время как если отправитель не является актером, это не является ошибкой, чтобы не ответить, если сообщение передано с!

Редактировать:

Вот код:

package akTest

import akka.actor.Actor

object Main1 {
  val worker = Actor.actorOf[ak].start()

  def main(args: Array[String]) {
    val resp = worker ? "Hi"
    resp.get
    println(resp)
  }
}

class ak extends Actor {
  def receive = {
    case msg:String  => {
      val response = "Received: " + msg
      println(response)
      response
    }
  }
}

Получается Exception in thread "main" akka.dispatch.FutureTimeoutException: Futures timed out after [4995] milliseconds

Поэтому я добавляю self.reply к актеру:

class ak extends Actor {
  def receive = {
    case msg:String  => {
      val response = "Received: " + msg
      println(response)
      self.reply(response)
      response
    }
  }
}

Это изменение исправляет ошибку тайм-аута.Но теперь, если у меня есть Main2, который отправляет сообщение о пожаре и забывании:

object Main2 {
  val worker = Actor.actorOf[ak].start()

  def main(args: Array[String]) {
    val resp = worker ! "Hi"
    println(resp)
  }
}

, выдается новая ошибка: [ERROR] [2/1/12 2:04 PM] [akka:event-driven:dispatcher:global-1] [LocalActorRef] No sender in scope, can't reply.

Как мне написать своего актера, чтобы устранить связьмежду его манерой ответа и методом вызова отправителя?Я не хочу иметь 1 версию актера для!а вторая версия для актера? 1022 *

1 Ответ

2 голосов
/ 02 февраля 2012

если senderFuture.isDefined, у вас есть будущее, чтобы ответить на

...