이전 포스트의 코드에 만약 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
}