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