次のアクターを考えてみましょう。
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
}
}
この単純なアクターは、すべてのジョブを基になるワーカーに転送します。ワーカーが忙しすぎる場合、ワーカーはジョブを拒否し、ジョブは後で待ち行列に入れられます。ある時点で、ワーカーは完了し、キューから別のジョブを要求します。
このアクターをテストするために、最初のジョブを拒否する偽のワーカーを渡しているので、それが実際にキューにあるかどうかをテストできます (GetJobs
これに関するメッセージがあり、キューは不変なので心配ありません)。ジョブが拒否された後、 のをscheduleOnce
送信しJobRequest
ます。delay
100 millis
ここで、テスト スイートからジョブを送信し、テクニックを使用して少し待ってからscheduleOnce
、GetJobs メッセージを送信します。運が良ければ、ジョブはキューに入っています。この手順を繰り返すと、今度はキューが再び空になるはずです。そして時々そうです。
タイミングを制御するより良い方法はありますか? 基本的に 3 つの遅延があるため、手動で調整する必要があります。そして、このチューニングが別のマシンで、またはそのようなテストをさらにいくつか追加した後、私のマシンでさえも機能するという保証はありません.