2016-12-16 141 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")