0

次のアクターを考えてみましょう。

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ます。delay100 millis

ここで、テスト スイートからジョブを送信し、テクニックを使用して少し待ってからscheduleOnce、GetJobs メッセージを送信します。運が良ければ、ジョブはキューに入っています。この手順を繰り返すと、今度はキューが再び空になるはずです。そして時々そうです。

タイミングを制御するより良い方法はありますか? 基本的に 3 つの遅延があるため、手動で調整する必要があります。そして、このチューニングが別のマシンで、またはそのようなテストをさらにいくつか追加した後、私のマシンでさえも機能するという保証はありません.

4

1 に答える 1

1

偽のワーカーを使用する代わりに、TestProbeを使用します。次に、プローブで標準の TestKit メソッドを使用して、プローブからアクターにメッセージを送り返すことができますStateful

リファレンス マニュアルのプローブの使用に関するセクションを参照してください。

于 2013-04-01T22:02:17.393 に答える