[Akka] Persistent Actor에서 shutdown message

smlee·2023년 10월 19일
0

Akka

목록 보기
36/50
post-thumbnail

이전 포스트의 코드에 만약 PoisonPill이나 Kill과 같은 메시지를 보내어 액터를 shutdown한다면 어떻게 될까?

즉, 메인 오브젝트가 다음과 같다면 어떻게 될까?

object PersistentActors extends App {
  val system = ActorSystem("PersistentActors")
  val accountant = system.actorOf(Props[Accountant], "simpleAccountant")

  (1 to 10).foreach(num => accountant ! Invoice("the sofa company", new Date, num * 1000))
  
  accountant ! PoisonPill
  
}

코드의 순서로만 본다면 Invoice 메시지가 10번 accountant 액터에게 전송된 후 액터가 종료될 것이라고 예상할 수 있다. 실제 실행 결과는 어떨까?

실제로는 PoisonPill 메시지가 먼저 도착하여 전송된 10번의 메시지는 dead letter가 된다. 그 이유는 PoisonPill이나 Kill과 같은 메시지들은 일반 Mailbox가 아닌 특별한 mailbox로 들어가기 때문에 순서가 뒤엉킨다. 따라서, Custom shutdown message를 정의하면 된다.

case object ShutDown

위와 같은 custom shutdown message를 정의하고, receiveCommand 핸들러에 다음과 같은 처리구문을 넣는다.

case ShutDown => context.stop(self)

따라서 메인 객체를 다음과 같이 바꾸면 출력 결과는 의도한 대로 나온다.

object PersistentActors extends App {
  val system = ActorSystem("PersistentActors")
  val accountant = system.actorOf(Props[Accountant], "simpleAccountant")

  (1 to 10).foreach(num => accountant ! Invoice("the sofa company", new Date, num * 1000))

  accountant ! ShutDown
}

0개의 댓글