在我的Web应用程序中,我正在使用Play!基于Akka来管理线程的框架。
在特定情况下,我编写了许多从外部服务收集数据的CompletionStages,我想控制并行请求的数量,以免给这些外部服务增加负担。
一种不更改整个应用程序的方法是控制Akka使用的线程池大小。
现在,我在akka中准备了两个线程池,并试图在两个池之间切换。
我正在使用这样的东西组成我的CompletionStages:

CompletableFuture.completedFuture(firstResult)
                        .thenComposeAsync( firstResult -> { dostuff(firstResult);}


根据Akka的documentation,这是设置当前线程池的方法:

// this is scala.concurrent.ExecutionContext
// for use with Futures, Scheduler, etc.
final ExecutionContext ex = system.dispatchers().lookup("my-dispatcher");


通过监视我的应用程序,像这样设置上下文不会影响应用程序,而只考虑默认的调度程序。有没有一种方法可以在Akka中动态设置当前池的大小?

最佳答案

您需要将自定义Executor传递给thenComposeAsync方法:

final java.util.concurrent.Executor exec = system.dispatchers().lookup("my-dispatcher");

CompletableFuture.completedFuture(firstResult)
                 .thenComposeAsync(firstResult -> {
                   dostuff(firstResult);
                 }, exec);

07-24 09:16