2011-10-12 59 views
1

我要發送的郵件列表,以一個演員,立即收到回覆在未來,然後等待所有期貨返回到調用方法之前完成。從閱讀阿卡文檔,我相信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() 
} 

什麼是發送一系列的消息給一個演員的正確方法,收到的未來,並返回一旦所有的期貨已經完成(可以存儲從每個將來的結果列表並返回它)。

+0

哪個版本阿卡您使用的是:D與搭配呢? –

+0

阿卡1.2使用Scala 2.9.1。 –

回答

3
(secondary ? GetRandom).mapTo[Int] 
3

阿卡?返回Future[Any]但你需要一個Future[Int]

因此,你可以定義哪些接受各類期貨品種列表:

val futures = new ListBuffer[Future[Any]] 

或儘快把結果作爲Int,因爲它是可用的:BTW

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

,使它的工作,你需要改變GetRandom的定義:

case object GetRandom extends Command 

an

case GetRandom => 
+0

偉大的回答,感謝您的幫助。我希望我能將兩個答案標記爲已接受的答案。 –

+1

我建議:Vector.fill(10)(?(二次GetRandom).mapTo [INT]) –

+0

謝謝,我對你的回答發現'mapTo'。它在哪個版本中引入? – paradigmatic