2017-02-17 62 views
1

我正在嘗試使用線程池來發起阻止請求。 問題是,每個請求都會阻塞整個池,並且項目將按順序進行處理。 不知道這是否可能。有人請幫助Akka演員池用於阻止請求

city-dispatcher { 
    type = Dispatcher 
    executor = "thread-pool-executor" 
    thread-pool-executor { 
    fixed-pool-size = 16 
    } 
    throughput = 100 
} 

而Java

 Props props = Props.create(CityDataProcessorActor.class, psRespHolder).withDispatcher("akka.actor.city-dispatcher"); 

    SmallestMailboxPool pool = new SmallestMailboxPool(10); 

    ActorRef cityRequestActorPool = actorSystem.actorOf(pool.props(props), "city-request-route"); 
    for (String city : citiesArray) { 
     Future<Object> future = Patterns.ask(cityRequestActorPool, new CityCommand(city.trim()), timeout); 
     Object results = Await.result(future, duration); 
     log.info(results.toString()); 
    } 
+1

'對象結果= Await.result(未來,持續時間);'這段代碼是阻塞。直到結果被聲明爲止,你的'for'循環纔會前進。 –

回答

0

蒙卡拉馬裏的評論是完全正確的。這是一個實現。它會在您創建期貨時創建期貨列表。然後按順序阻止收集的期貨記錄每一個。隨着迭代的進行,等待將變得微不足道,提供後期期貨在相似的時間內完成。

.... 
Array<Future<Object>> futures = new ArrayList<>(); 
for (String city : citiesArray) { 
    Future<Object> future = Patterns.ask(cityRequestActorPool, new CityCommand(city.trim()), timeout); 
    futures.add(future); 
} 

for (<Future<Object>> f :futures){ 
    Object results = Await.result(f, duration); 
    log.info(results.toString()); 
} 
0

如@Mon烏賊提到 Object results = Await.result(future, duration);是一個阻塞調用。可以嘗試將來與回調

future onComplete{ case Success()=> println(result) case Failure()=> println("some error") }