2017-02-17 2 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") }

関連する問題