3

Scala 2.10、Akka 2.1、Play 2.1 を使用しています。バックエンドに http リクエストを送信すると、1askつのアクターが何かを計算します。タイムアウト前に返された場合は計算の結果を返し、それ以外の場合は別の文字列を返すという考え方です。以下のコードを参照してください。

val futureInt: Future[Int] = ask(testActor, Calculate(number.toInt)).mapTo[Int]
val timeoutFuture = play.api.libs.concurrent.Promise.timeout("Oops", 2.seconds)

Async {
  Future.firstCompletedOf(Seq(futureInt, timeoutFuture)).map {
    case i: Int => Ok("Got result " + i)
    case t: String => Ok("timeout expired")
  }
}

出演者は以下の通り。

class TestActor() extends Actor {
  def receive = {
    case Calculate(tonumber: Int) =>
      for (a <- 1 to tonumber) {
        val c: Double = scala.math.pow(a, 2)
        println("a: " + a + ", c: " + c)
      }
      12345 // hardcoded value to return when the calculation finishes
    case _ =>
      println("bah")
  }
}

私の問題は、アクターがタイムアウト前に終了しても、フューチャーによって何も返されないため、タイムアウトが常に期限切れになることです。私は何を間違っていますか?どうもありがとう。

4

1 に答える 1

3

http://doc.akka.io/docs/akka/snapshot/scala/actors.htmlから

ask を使用すると、tell と同様に受信側のアクターにメッセージが送信され、受信側のアクターは送信者で応答する必要があります。返された Future を値で完成させるために応答します。

警告

Future を例外付きで完了するには、Failure メッセージを送信者に送信する必要があります。メッセージの処理中にアクターが例外をスローした場合、これは自動的には行われません。

したがって、通常の scala 関数のように「返す」のではなく、次の行に沿って何かを行います。

def receive = {
  case Calculate(tonumber: Int) =>
    ...
    sender ! 12345
  case _ =>
    sender ! akka.actor.Status.Failure(new InvalidArgumentException)
}
于 2013-02-08T12:58:31.073 に答える