我有一个代表工作人员长时间工作的演员:
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 :(得分: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.将您的调度程序附加到您通过配置创建的自定义邮箱。