1

メッセージのリストをアクターに送信し、将来すぐに返信を受け取り、すべての先物が完了するのを待ってから呼び出し元のメソッドに戻りたいと考えています。akka docs を読むと、Future.sequence が最適だと思いますが、次のコードを正しく動作させることができませんでした。コンパイラから次のエラーが表示されます。

  found   : akka.dispatch.ActorCompletableFuture
  required: akka.dispatch.Future[Integer]
Error occurred in an application involving default arguments.
            futures += secondary ? GetRandom
                                 ^

明らかな何かが欠けていると確信していますが、例と API ドキュメントによると、以下のコードは「正しい」ようです。

import java.util.Random
import akka.dispatch.Future
import akka.actor._
import Commands._
import collection.mutable.ListBuffer

object Commands {
    trait Command

    case class GetRandom() extends Command
    case class GenRandomList() extends Command  
}

class Secondary() extends Actor {
    val randomGenerator = new Random()

    override def receive = {
        case GetRandom() =>
            self reply randomGenerator.nextInt(100)
    }
}

class Primary() extends Actor {
    private val secondary = Actor.actorOf[Secondary]

    override def receive = {

        case GenRandomList() =>

            val futures = new ListBuffer[Future[Integer]]

            for (i <- 0 until 10) {
                futures += secondary ? GetRandom
            }

            val futureWithList = Future.sequence(futures)

            futureWithList.map { foo =>
                println("Shouldn't foo be an integer now? " + foo)
            }.get
    }

    override def preStart() = {
        secondary.start()
    }
}

class Starter extends App {
    println("Starting")
    var master = Actor.actorOf(new Primary()).start()
    master ! GenRandomList()
}

一連のメッセージをアクターに送信し、未来を受け取り、すべての未来が完了したら戻る正しい方法は何ですか (オプションで、各未来からの結果をリストに保存して返す)。

4

2 に答える 2

3
(secondary ? GetRandom).mapTo[Int]
于 2011-10-12T08:39:32.153 に答える
3

Akka?は a を返しますFuture[Any]が、必要なのはFuture[Int].

したがって、すべての種類の先物を受け入れるリストを定義できます。

val futures = new ListBuffer[Future[Any]]

Intまたは、結果が利用可能になるとすぐにキャストします。

for (i <- 0 until 10) {
  futures += (secondary ? GetRandom) map {
    _.asInstanceOf[Int]
  }
}

GetRandomところで、それを機能させるには、定義を変更する必要があります:

case object GetRandom extends Command

それを次のように一致させます。

case GetRandom =>
于 2011-10-12T07:48:57.857 に答える