2017-06-15 75 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.将您的调度程序附加到通过配置创建的自定义邮箱。