考虑以下演员:
class Stateful(worker: ActorRef) extends Actor {
val queue = // immutable queue with details
def receive = {
case NewJob(details) => worker ! details
case JobRejection(details) if sender == worker => // enqueue
case JobRequest if sender == worker => // dequeue and send to worker
}
}
这个简单的actor将所有工作转发给它的底层worker。如果工人太忙,他会拒绝这份工作,并且该工作会被排入队列以备后用。在某个时候,工作人员完成并从队列中请求另一个作业,依此类推。
为了测试这个演员,我传递了一个拒绝第一份工作的假工人,所以我可以测试它是否真的在队列中(有一个GetJobs
消息,队列是不可变的,所以不用担心)。工作被拒绝后,我scheduleOnce
用.JobRequest
delay
100 millis
现在我从我的测试套件发送作业,使用该scheduleOnce
技术稍等片刻,然后发送 GetJobs 消息。如果我很幸运,这份工作正在排队。我重复该过程,这次队列应该再次为空。有时确实如此。
有没有更好的方法来控制时间?因为基本上有三个延迟,我必须手动调整。并且在添加了另外几个这样的测试之后,不能保证这种调整可以在不同的机器上运行,甚至在我的机器上运行。