Акка Фьючерс Исключения

Что происходит, когда актер будущего выдает исключение?

Согласно документации Akka по адресу http://doc.akka.io/docs/akka/snapshot/scala/futures.html:

Не имеет значения, завершает ли Актер или диспетчер Future, и если поймано исключение, оно будет содержать его вместо действительного результата. Если Future содержит Исключение, вызов Await.result вызовет его повторный выброс, чтобы его можно было правильно обработать.

Я не уверен, что это то, что я вижу, когда запускаю этот кусок кода:

  class Worker extends Actor {
    def receive = {
      case i: Int => throw new RuntimeException
    }         
  }

  implicit val system = ActorSystem("MySystem")
  val worker = system.actorOf(Props(new Worker), name="worker")
  implicit val timeout = Timeout(5 minutes)
  val future = worker ? 0
  val res = Await.result(future, 10 seconds)

Согласно документации, Await.result должен снова выдать исключение, но я получаю TimeoutException! Может кто-нибудь прояснить это?

1 ответ

Решение

Для актеров вам нужно поймать исключение и вернуть его как статус отказа. Сейчас вы ничего не возвращаете отправителю, поэтому вы получаете исключение тайм-аута:

class Worker extends Actor {
  def receive = {
    case i: Int => {
      try {
        throw new RuntimeException
        sender ! "Some good result"
      } catch {
        case e: Exception =>
          sender ! akka.actor.Status.Failure(e) // Alert the sender of the failure
          throw e // Alert any supervisor actor of the failure
      }
    }
  }
}

Фьючерсы могут справиться с этим немного более изящно, поскольку они всегда отправляют результат, а актеры - нет (это даст вам тот же результат, что и выше):

  val future = Future {
    throw new RuntimeException
  }
Другие вопросы по тегам