28

役者をしばらく眠らせることができるようにしたいです。俳優は、どれくらい寝るかを自分で決めなければなりません。Thread.sleep() はこれを行うための推奨される方法ではないため、akka でスケジューラーを使用することを考えました。したがって、別のアクターがウェイクアップのために登録できるアクターを定義しました。

class Scheduler extends Actor {

  def receive = {
    case Sleep(duration) => context.system.scheduler.scheduleOnce(duration) {
      sender ! Ring
    }
  }
}

しかし、送信側のアクターは Ring メッセージを受信しません。だから私の質問は

  • アクター内で推奨されるスケジューラーによるスケジューリングはありますか?
  • 送信側のアクターが Ring メッセージを受信しないのはなぜですか?
  • これが不可能な場合、問題を解決するための推奨される方法は何ですか?
4

3 に答える 3

45

最初にタイトルの質問に答えましょう。はい、アクター内でスケジューラーを使用することは可能です。

case Sleep(duration) =>
  context.system.scheduler.scheduleOnce(duration, self, Ring)

さて、質問の背後にある質問に

あなたは実際に何を達成したいのかを言わなかったので、ここでは、俳優(通常は「X」と呼ばれるものを実行します)に「Y」と呼ばれるものをしばらく実行して、「X」を一時停止してほしいと推測しています。 " アクティビティ。これに対する完全な解決策は

class Sleepy extends Actor {
  def receive = {

    ... // cases doing “X”

    case Sleep(duration) =>
      case object WakeUp
      context.system.scheduler.scheduleOnce(duration, self, WakeUp)
      context.become({
        case WakeUp => context.unbecome()
        // drop the rest
      }, discardOld = false)
  }
}

FSMトレイトを使用し、通常状態とスリープ状態を切り替えることで、同じことを実装することもできます。そしてもちろん、睡眠中に好きなことを行うことができます。たとえばStash、Akka 2.1の特性を混ぜ合わせて、メッセージを受信するときに、stash()睡眠中にすべて(または一部)のメッセージを呼び出すことができます。または、まったく別のことをすることもできます。アクターは非常に柔軟です。unstashAll()WakeUp

俳優がしないこと

アクターは実際にスリープすることはなく、常に着信メッセージを処理します。上に示したように、それが何を意味するかを定義できますが、基本的な原則は、メールボックス内のメッセージを処理しないようにアクターを一時停止することはできないということです。

于 2012-12-16T07:47:01.207 に答える
16

スケジューラに渡されたクロージャで「送信者」をクローズしています。これは、Ring メッセージが間違ったアクターに送信されている可能性が高いことを意味します。代わりにこれを行う必要があります。

case Sleep(duration) => 
  val s = sender
  context.system.scheduler.scheduleOnce(duration) {
    s ! Ring
  }
}
于 2012-12-15T22:21:20.293 に答える
0

ローランド・クーンの答えは主題をカバーしています。スケジューラを使用するための別の一般的なユースケースがあることを追加したかっただけです:別のアクターにメッセージを送信し、このアクターが応答するのを待っているとき、タイムアウトで待機を制限することは非常に一般的です.

otherActor ! Request(...)
context.system.scheduler.scheduleOnce(duration, self, WakeUp)
...
case Response(...) => ...
case WakeUp => context stop self
于 2016-05-04T19:14:27.553 に答える