如何正确地实施作业队列与职工演员
问题描述:
我有代表工人重长时间作业的演员:如何正确地实施作业队列与职工演员
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
}
}
此外,我不知道如何正确处理故障在这种情况下...
答
我认为最好的做法是使用有界邮箱工人演员。
然后,你可以配置限定在一个配置是这样的:
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.将您的调度程序附加到通过配置创建的自定义邮箱。