2016-12-16 37 views
2

这里是我的使用情况:阿卡均衡池中有可变大小的线程池执行人

我想创建一个大小为x的平衡池路由器(x是实例的数量/该在确定routees运行时),每个路由都有自己的专用线程。 每个路线预计将执行阻止操作。

Akka文档解释说您不能更改平衡池的调度程序。这就消除了使用固定调度程序的选项(它将完成我所需要的任务,每个routee的大小为1的线程池)。

Akka documentation

的BalancingPool自动使用其routees特殊BalancingDispatcher - 无论是在routee道具对象上设置任何调度。这是通过所有路由共享相同邮箱来实现平衡语义所必需的。

虽然无法更改路由器使用的调度程序,但可以微调使用的执行程序。默认情况下,的fork-join-调度使用,并在调度员解释可以配置[AJ:我相信这是一个错字,他们平均的fork-join执行人]。在该routees预计将进行封闭操作情况下,可能是有用的一个线程池执行人暗示分配的线程明确

从阿卡文档

配置样品以及数量来替代它:

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(同样风格)

由于Balancing Dispatcher is "Driven by: java.util.concurrent.ExecutorService",是否有可能创建一个ExecutorService并将其传递给平衡池路由器或其调度程序?

回答

0

也许是这样的:

val bp = BalancingPool(instances, routerDispatcher = "pinned-dispatcher") 
val myRouter = context.actorOf(Props...) 
    .withRouter(bp), 
    name = "myRouter")