如何正确实现与worker actor的作业队列

时间:2017-06-15 05:03:57

标签: akka

我有一个代表工作人员长时间工作的演员:

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
  }

}

此外,我不确定在这种情况下如何妥善处理失败......

1 个答案:

答案 0 :(得分: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.将您的调度程序附加到您通过配置创建的自定义邮箱。