我正在尝试使用线程池来发出阻止请求。 问题是,每个请求都阻塞整个池,项目按顺序进行处理。 不确定这是否可行。有人请帮忙
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());
}
和Java
li
答案 0 :(得分:0)
Mon Calamari的评论完全正确。这是一个实现。它会在您创建期货时创建一个期货清单。然后它按顺序阻止收集的Futures记录每一个。随着迭代的进行,等待应该变得微不足道,因为后来的期货已经在相似的时间内完成了。
....
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());
}
答案 1 :(得分:0)
正如@Mon Calamari所说
Object results = Await.result(future, duration);
是阻止通话。你可以用回调试试未来
future onComplete{
case Success()=> println(result)
case Failure()=> println("some error")
}