Akka postStop не выполняется в примере жизненного цикла - PullRequest
0 голосов
/ 18 марта 2020

Я новичок в akka и следил за примерами документации. Я запустил пример жизненного цикла об остановке актеров, но вывод не содержит сообщения очистки. Кажется, что этот пример неверен или я пропустил sth.

Почему сигнал PostStop не достиг MasterControlProgram?

import akka.actor.typed.Behavior
import akka.actor.typed.scaladsl.Behaviors
import akka.actor.typed.{ ActorSystem, PostStop }


object MasterControlProgram {
  sealed trait Command
  final case class SpawnJob(name: String) extends Command
  final case object GracefulShutdown extends Command

  // Predefined cleanup operation
  def cleanup(log: Logger): Unit = log.info("Cleaning up!")

  def apply(): Behavior[Command] = {
    Behaviors
      .receive[Command] { (context, message) =>
        message match {
          case SpawnJob(jobName) =>
            context.log.info("Spawning job {}!", jobName)
            context.spawn(Job(jobName), name = jobName)
            Behaviors.same
          case GracefulShutdown =>
            context.log.info("Initiating graceful shutdown...")
            // perform graceful stop, executing cleanup before final system termination
            // behavior executing cleanup is passed as a parameter to Actor.stopped
            Behaviors.stopped { () =>
              cleanup(context.system.log)
            }
        }
      }
      .receiveSignal {
        case (context, PostStop) =>
          context.log.info("Master Control Program stopped")
          Behaviors.same
      }
  }
}

object Job {
  sealed trait Command

  def apply(name: String): Behavior[Command] = {
    Behaviors.receiveSignal[Command] {
      case (context, PostStop) =>
        context.log.info("Worker {} stopped", name)
        Behaviors.same
    }
  }
}

import MasterControlProgram._

val system: ActorSystem[Command] = ActorSystem(MasterControlProgram(), "B7700")

system ! SpawnJob("a")
system ! SpawnJob("b")

Thread.sleep(100)

// gracefully stop the system
system ! GracefulShutdown

Thread.sleep(100)

Await.result(system.whenTerminated, 3.seconds)

, и это вывод:

22:32:11.797 [B7700-akka.actor.default-dispatcher-6] INFO akka.event.slf4j.Slf4jLogger - Slf4jLogger started
22:32:11.868 [B7700-akka.actor.default-dispatcher-3] INFO MasterControlProgram$ - Spawning job a!
22:32:11.877 [B7700-akka.actor.default-dispatcher-3] INFO MasterControlProgram$ - Spawning job b!
22:32:11.958 [B7700-akka.actor.default-dispatcher-6] INFO MasterControlProgram$ - Initiating graceful shutdown...
22:32:12.011 [B7700-akka.actor.default-dispatcher-3] INFO Job$$anonfun$apply$4 - Worker b stopped
22:32:12.011 [B7700-akka.actor.default-dispatcher-6] INFO Job$$anonfun$apply$4 - Worker a stopped

1 Ответ

2 голосов
/ 23 марта 2020

Эта ошибка была исправлена ​​в 2.6.4, см. https://github.com/akka/akka/issues/28557

...