2013-08-26 42 views
3

在Akka 2.2.0中,我有一個循環路由演員,我想要一個自定義調度員坐在上面。Akka Config - application.conf - 設置調度程序和路由器

在我的application.conf我有;

durable-dispatcher { 
    mailbox-type = akka.actor.mailbox.filebased.FileBasedMailboxType 
} 

akka.actor.deployment { 
    /notificationServiceWorkers { 
    dispatcher = durable-dispatcher 
    router = round-robin 
    nr-of-instances = 5 
    } 
} 

現在,當我嘗試創建這樣的演員時,

ActorRef notificationServiceWorkers = akka.actorOf(Props.create(NotificationServiceActor.class) 
    .withRouter(new FromConfig()), "notificationServiceWorkers") 

調度程序沒有從配置中提取,它使用默認的調度程序。

如果我刪除.withRouter,Akka拿起調度程序的配置就好,但顯然它不再路由。

如果我加上.withDispatcher這樣;

ActorRef notificationServiceWorkers = akka.actorOf(Props.create(NotificationServiceActor.class) 
     .withDispatcher("durable-dispatcher") 
     .withRouter(new FromConfig()), "notificationServiceWorkers") 

這一切正常。問題是(從doco中不清楚)如果我想從application.conf加載調度程序和路由器配置,那麼爲什麼我需要在Props創建中提供這兩者?這是一個錯誤?

回答

5

您的部署沒有拿起的原因是路由被創建爲路由器的子節點,因此他們住在路徑notificationServiceWorkers/*

3

深入研究LocalActorRefProvider中的Akka代碼,您可以在actorOf的內部看到,如果它是非路由的參與者,他們只會將調度程序從部署配置中取出。我想他們有他們的理由,但它對你的意義是,如果你要使用路由器,並且你想要一個不同的調度器(除了默認調度器),你將需要明確地使用withDispatcherProps實例,你將無法從配置中獲取它。再一次,我不知道這是否是一個錯誤,但是從代碼的外觀來看,當它是一個路由的actor時,它們似乎不會從配置中拉出來。

+0

這是偉大的。感謝cmbaxter。我認爲這也是預期的功能。有興趣知道爲什麼。 – NightWolf

1

作爲除了羅蘭·庫恩的答案,這是工作:

"/notificationServiceWorkers/*" { 
    dispatcher = durable-dispatcher 
}