用于阻止请求的Akka actor池

时间:2017-02-17 12:46:41

标签: java scala akka actor blocking

我正在尝试使用线程池来发出阻止请求。 问题是,每个请求都阻塞整个池,项目按顺序进行处理。 不确定这是否可行。有人请帮忙

        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

2 个答案:

答案 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") }