2017-02-17 2 views
1

J'essaye d'utiliser un pool de threads pour faire des requêtes de blocage. Le problème est que chaque requête bloque tout le pool et que les éléments sont traités séquentiellement. Je ne sais pas si c'est même possible. Quelqu'un s'il vous plaît aiderAkka pool d'acteurs pour bloquer les requêtes

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

Et 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

'résultats Object = Await.result (futur, durée);' ce morceau de code bloque. Votre boucle 'for' ne progressera pas tant que les résultats ne seront pas réclamés. –

Répondre

0

Commentaire de Mon Calamari est tout à fait correct. Voici une implémentation. Cela créera une liste des contrats à terme au fur et à mesure que vous les créerez. Ensuite, il se bloque sur les Futures collectés séquentiellement pour se connecter à chacun. Les attentes devraient devenir triviales au fur et à mesure que l'itération progresse, pourvu que les Futures ultérieurs se terminent en même temps.

.... 
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

Comme @Mon Calamari mentionné Object results = Await.result(future, duration); est un appel de blocage. vous pouvez essayer avenir avec rappel

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