公式の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 => ;
}
}
}
このようにして、再起動される前にアクターによって処理されなかったメッセージは、新しいアクターのキューの最後にプッシュされます。
だから私の質問は:私がこれをするべきではない理由はありますか?
私が考えることができる唯一のことは、メッセージが何らかの理由で不正な形式である場合、それがシステムを離れることは決してなく、アクターが定期的に再起動されることはないということです...