这是我的用例:
我想创建一个大小为 x 的平衡池路由器(x 是在运行时确定的实例/路由的数量),每个路由都有自己的专用线程。每个路由都应该执行阻塞操作。
Akka 文档解释说您不能更改平衡池的调度程序。这消除了使用固定调度程序的选项(这正是我需要的,每个路由大小为 1 的线程池)。
来自Akka 文档:
BalancingPool 自动为其路由使用特殊的 BalancingDispatcher - 忽略在 routee Props 对象上设置的任何调度程序。这是为了通过所有路由共享同一个邮箱来实现平衡语义所必需的。
虽然无法更改路由使用的调度程序,但可以微调使用的执行程序。默认情况下,使用fork-join-dispatcher并且可以按照 Dispatchers [AJ:我相信这是一个错字,它们的意思是 fork-join-executor]中的说明进行配置。在期望路由执行阻塞操作的情况下,将其替换为线程池执行器可能会很有用,该线程池执行器显式提示分配的线程数
来自 Akka 文档的配置示例:
akka.actor.deployment {
/parent/router10b {
router = balancing-pool
nr-of-instances = 5
pool-dispatcher {
executor = "thread-pool-executor"
# allocate exactly 5 threads for this pool
thread-pool-executor {
core-pool-size-min = 5
core-pool-size-max = 5
}
}
}
}
池大小与路由数量匹配的线程池执行器似乎可以工作,但问题是:我如何动态(在运行时)设置我的线程池执行器的池大小以匹配路由数量,如果必须在配置中明确设置池大小?
此外,是否可以在从配置中提取其路由的执行程序时创建平衡池(在代码中)?即我不想使用配置来定义我的路由器,我想使用:
val myRouter = BalancingPool(x).props(Props[Worker])...)
但以某种方式指定要使用的执行程序(来自配置),使用与 withMailbox() 或 withDispatcher() 相同的样式
由于平衡调度程序是“驱动:java.util.concurrent.ExecutorService”,是否可以创建一个 ExecutorService 并将其传递给平衡池路由器或其调度程序?