23

公式のakka2.0.4ドキュメントでは、次のように述べています。

アクターの再起動は、実際のアクターオブジェクトのみを置き換えます。メールボックスの内容は再起動の影響を受けないため、postRestartフックが戻った後にメッセージの処理が再開されます。例外をトリガーしたメッセージは再度受信されません。再起動中にアクターに送信されたメッセージは、通常どおりメールボックスのキューに入れられます。

アクターを再起動させるメッセージがあるとしましょう。メールボックスにはもう存在しないため、代わりのアクターによって処理されることはありません。とにかくこのメッセージをアクターが処理するようにしたい場合(その場合、順序は重要ではないと仮定して)、アクターが再起動時にメッセージを自分自身に送信するのは悪い考えですか?

私が何を意味するかを示すためのいくつかの(擬似)コード:

class ResendingActor extends Actor {
  var curMessage: Option[MyMessage] = None
  def receive = {
    case MyMessage(x) => {
      curMessage = Some(MyMessage(x))
      /* processing */
      curMessage = None
    }
  }
  override def preRestart(reason: Throwable, message: Option[Any]) {
    curMessage match {
      case Some(x) => self ! x
      case None => ;
    }
  }
}

このようにして、再起動される前にアクターによって処理されなかったメッセージは、新しいアクターのキューの最後にプッシュされます。

だから私の質問は:私がこれをするべきではない理由はありますか?

私が考えることができる唯一のことは、メッセージが何らかの理由で不正な形式である場合、それがシステムを離れることは決してなく、アクターが定期的に再起動されることはないということです...

4

1 に答える 1

17

preRestartですでに失敗したメッセージが表示されているので(メッセージ:Option [Any]を参照)、自分でメッセージを隠しておく必要はありません。はい、それを自分自身に再送信することはまったく問題ありませんが、これと組み合わせて無限に再起動することに注意してください。破棄されることのないメッセージが表示される可能性が高いためです。

于 2012-11-25T01:32:35.777 に答える