这是我的用例:
我想创建一个大小x的平衡池路由器(x是运行时确定的实例/路由的数量),每个路由器都有自己的专用线程。预计每个路由将执行阻止操作。
AKKA文档解释说,您无法更改平衡池的调度员。这消除了使用固定调度器的选项(这将完全做我需要的东西,每个路由的大小为1的线池)。
来自Akka文档:
平衡池会自动为其路由使用特殊的balincingDispatcher - 无视在Routee Props对象上设置的任何调度程序。这是为了通过所有路由共享同一邮箱实现平衡语义所需的。
虽然无法更改路由使用的调度程序,但可以微调使用的执行者。默认情况下,使用 fork-join-dispatcher ,可以按调度器中的说明进行配置 [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
}
}
}
}
似乎匹配路由数量的池大小的ThreadPool遗嘱执行人,但这是问题:我如何(在运行时)动态(在运行时)设置ThreadPool executor的池大小以匹配数字如果必须在配置中明确设置池大小?
另外,在从配置中提取其路由的执行者时,是否可以创建平衡池(在代码中)?即我不想使用配置来定义路由器,我想使用:
val myRouter = BalancingPool(x).props(Props[Worker])...)
但以某种方式指定使用哪个执行程序(来自config),使用相同的withmailbox()或withdispatcher()
由于平衡调度程序是"驱动的:
也许是这样的东西:
val bp = BalancingPool(instances, routerDispatcher = "pinned-dispatcher")
val myRouter = context.actorOf(Props...)
.withRouter(bp),
name = "myRouter")