Актеры Akka выходят не так, как ожидается - PullRequest
0 голосов
/ 01 февраля 2020

Следуя документации akka , например, в разделе «Жизненный цикл актера», вывод для меня не такой, как задокументированный. Я получаю:

первый запуск

второй запуск

второй останов

Код:

object StartStopActorMain extends App {
  val first = ActorSystem(StartStopActor1(), "firstActor")
  first ! "stop"
}

object StartStopActor1 {
  def apply() =
      Behaviors.setup(context => new StartStopActor1(context))
}

class StartStopActor1(context: ActorContext[String]) extends 
      AbstractBehavior[String](context) {
    println("first started")
    context.spawn(StartStopActor2(), "second")

    override def onMessage(msg: String): Behavior[String] =
        msg match {
          case "stop" => Behaviors.stopped
    }

    override def onSignal: PartialFunction[Signal, Behavior[String]] = {
        case PostStop =>
         println("first stopped")
         this
    }
}

object StartStopActor2 {

  def apply() =
      Behaviors.setup(context => new StartStopActor2(context))

 }

class StartStopActor2(context: ActorContext[String]) extends 
        AbstractBehavior[String](context) {
     println("second started")

    override def onMessage(msg: String): Behavior[String] = Behaviors.unhandled

   override def onSignal: PartialFunction[Signal, Behavior[String]] = {
         case PostStop =>
           println("second stopped")
           this
    }
}

Что-то, чего мне здесь не хватает? Я сам скопировал код оттуда.

1 Ответ

1 голос
/ 02 февраля 2020

С количеством предоставленной вами информации невозможно ответить на ваш вопрос. Но я думаю, что ваша JVM завершает работу до того, как у первого актера появится возможность распечатать свое стоп-сообщение.

Редактировать

Возможно, документация Akka также неправильно: первый актер заменяет свое поведение на Behaviors.stopped, поэтому сигнал PostStop доставляется не поведению StartStopActor1, а остановленному поведению. Я помню, как реализовывал это несколько лет назад, с обоснованием того, что перехват PostStop не нужен, когда субъект добровольно завершает работу: любой код, который вы хотели бы запустить для PostStop, также можно запустить до возврата Behaviors.stopped.

...