2017-06-15 74 views
0

我有代表工人重長時間作業的演員:如何正確地實施作業隊列與職工演員

class Worker extends Actor{ 

    override def receive: Receive = { 
    case "doJob" => 
     Thread.sleep(999999) 
     sender ! "JobResult" 
    } 

} 

我將不得不限制作業隊列,並明確拒絕的用戶,如果隊列已滿。實施這個邏輯的最佳實踐是什麼?我應該使用邊界郵箱還是一些調度程序,該監視作業隊列?事情是這樣的:

class Dispatcher(worker:ActorRef) extends Actor{ 

    val MAX_JOBS = 10 

    var jobs = 0 

    override def receive: Receive = { 
    case "newJob" => 
     if (jobs >= MAX_JOBS) sender ! "Try later" 
     jobs+=1 
     worker ! "doJob" 

    case "JobResult" => 
     jobs-=1 
    } 

} 

此外,我不知道如何正確處理故障在這種情況下...

回答

0

我認爲最好的做法是使用有界郵箱工人演員。

然後,你可以配置限定在一個配置是這樣的:

bounded-mailbox { mailbox-type = "akka.dispatch.BoundedMailbox" 
mailbox-capacity = 1000 mailbox-push-timeout-time = 10s } 

akka.actor.mailbox.requirements { 
"akka.dispatch.BoundedMessageQueueSemantics" = bounded-mailbox 
} 

您還可以指定希望(從內置類型),或創建自己的自定義郵箱與自己的郵箱的類型特點和規格。 (該消息首先處理等)

我認爲在您的情況最好是: 1.要使用它自己的錯誤機制和自定義清理/邊界限制,創建自己的郵箱。 (基於有界郵箱特徵) 3.將您的調度程序附加到通過配置創建的自定義郵箱。