super.preRestartの位置でライフサイクルメソッドの呼ばれる順番は変わる - akka

akka 2.3.13です。

preRestartの中のどの位置でsuper.preRestart(..) を呼ぶかによって微妙に処理の順番が変わって辛かったのでメモします。

gist.github.com

コメントのとおりですが、

最初にsuper.preRestartを呼ぶとpreStart -> postStop -> preRestart 最後にsuper.preRestartを呼ぶとpreStart -> preRestart -> postStop の順番で処理されるようです。

これはclass ActorのpreRestartの実装の中でpostStopメソッドを呼んでいることが原因です。 つまり下記コメントの一でpostStopが呼ばれています。

override def preRestart(reason: Throwable, message: Option[Any]): Unit = {
    super.preRestart(reason, message) // <-- ここでpostStopが呼ばれている
    println("preRestart")

当然super.preRestart(..) の位置をずらしてしまったら先にpreRestartの処理が走ってしまいます(◞‸◟)

さらに選択肢としてはsuper.preRestartを呼ばないことにより「postStopを処理しない」みたいなことも可能です。 postStopを呼ばない動機はよく分かりませんが、前回の記事で super.postRestartを呼ばないことによりpreStartを処理しないみたいなパターンが出てきたので、それと同じような応用法があるかもしれません。

言われてみれば当たり前ですがちょっと柔軟すぎる気がするんですがなれたらいい感じなんですかね(´;ω;`)