일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- play 강좌
- 엔터프라이즈 블록체인
- 파이썬 강좌
- 블록체인
- 이더리움
- Hyperledger fabric gossip protocol
- 하이퍼레저 패브릭
- Golang
- 하이브리드앱
- 파이썬
- Akka
- 스칼라 강좌
- 스칼라 동시성
- Play2 로 웹 개발
- 파이썬 머신러닝
- 스위프트
- 스칼라
- 플레이프레임워크
- 그라파나
- Adapter 패턴
- 주키퍼
- CORDA
- 파이썬 데이터분석
- Actor
- 파이썬 동시성
- hyperledger fabric
- play2 강좌
- akka 강좌
- 안드로이드 웹뷰
- Play2
- Today
- Total
HAMA 블로그
예제로 보는 아카(akka) - 4. 액터 생명 주기 본문
- Scala 2.11 기반
- Akka 2.4.11 기반
- Learning Concurrent Programming in Scala 참고
액터 생명 주기
import akka.actor.{Actor, ActorRef, ActorSystem, Props}
import akka.event.Logging
class LifecycleActor extends Actor {
val log = Logging(context.system, this)
var child: ActorRef = _
def receive = {
case num: Double => log.info(s"got a double - $num")
case num: Int => log.info(s"got an integer - $num")
case lst: List[_] => log.info(s"list - ${lst.head}, ...")
case txt: String => child ! txt
}
override def preStart(): Unit = {
log.info("about to start")
child = context.actorOf(Props[StringPrinter], "kiddo")
}
override def preRestart(reason: Throwable, msg: Option[Any]): Unit = {
log.info(s"about to restart because of $reason, during message $msg")
super.preRestart(reason, msg)
}
override def postRestart(reason: Throwable): Unit = {
log.info(s"just restarted due to $reason")
super.postRestart(reason)
}
override def postStop() = log.info("just stopped")
}
class StringPrinter extends Actor {
val log = Logging(context.system, this)
def receive = {
case msg => log.info(s"child got message '$msg'")
}
override def preStart(): Unit = log.info(s"child about to start.")
override def postStop(): Unit = log.info(s"child just stopped.")
}
object ActorsLifecycle extends App {
val ourSystem = ActorSystem("mysystem")
val testy = ourSystem.actorOf(Props[LifecycleActor], "testy")
testy ! math.Pi
Thread.sleep(1000)
testy ! 7
Thread.sleep(1000)
testy ! "hi there!"
Thread.sleep(1000) testy ! List(1,2,3)Thread.sleep(1000)
testy ! Nil
Thread.sleep(1000)
testy ! "sorry about that"
Thread.sleep(1000)
ourSystem.stop(testy)
Thread.sleep(1000)
ourSystem.terminate()
}
- LifecycleActor 액터가 시작 될 때, preStart 가 호출되었다.
- LifecycleActor 액터가 자식 액터를 만들었기때문에 StringPrinter 도 preStart가 호출된다.
눈여겨 봐야할 부분은 LifecycelActor 액터에 Nil (빈List객체)을 보내서 예외를 만든 후에 어떻게 액터가
반응하는지를 봐야한다. 진행 순서는
0. 먼저 LifecycleActor 에서 예외가 발생
1. LifecycleActor 의 preRestart 호출
2. LifecycleActor 의 postStop 호출
3. LifecycleActor 의 자식 액터의 postStop 호출
4. LifecycleActor 는 postRestart 호출
6. LifecycleActor 의 preStart 호출
7. LifecycleActor 의 자식 액터가 만들어지면서 preStart 호출
결과
about to start
child about to start.
got a double - 3.141592653589793
got an integer - 7
child got message 'hi there!'
list - 1, ...
head of empty list
java.util.NoSuchElementException: head of empty list // 예외 발생 !!!
about to restart because of java.util.NoSuchElementException // LifecycleActor preRestart 호출
just stopped // LifecycleActor postStop 호출
child just stopped. // LifecycleActor 의 자식 액터의 postStop 호출
just restarted due to java.util.NoSuchElementException: // LifecycleActor 액터의 postRestart 호출
about to start // 새로 생성된 LifecycleActor 액터의 preStart 호출
child about to start. // 새로 생성된 LifecycleActor 액터의 postRestart 호출
child got message 'sorry about that'
child just stopped.
just stopped
흐름도
흐름도를 보고 생명 주기를 복습해보자
0. 액터 에서 예외 발생
1. 해당 액터의 preRestart 호출
2. 해당 액터의 postStop 호출
3. Props 를 이용해서 새로운 액터 생성
4. 새 액터의 postRestart 호출
5. 이전 액터가 사용하던 우편함을 새 액터에 할당
7. 해당 액터의 preStart 호출
'Akka' 카테고리의 다른 글
예제로 보는 아카(akka) - 6. 액터 관리 (고장/예외 처리하기) (0) | 2016.10.05 |
---|---|
예제로 보는 아카(akka) - 5. 액터 사이의 통신및 액터 멈추기 (0) | 2016.10.05 |
예제로 보는 아카(akka) - 3. 부모,자식 액터 (0) | 2016.10.05 |
예제로 보는 아카(akka) - 2. 생성 (Hello Akka) 및 메세지 수신 (0) | 2016.10.04 |
예제로 보는 아카(akka) - 1. 세팅 (0) | 2016.10.04 |