관리 메뉴

HAMA 블로그

예제로 보는 아카(akka) - 2. 생성 (Hello Akka) 및 메세지 수신 본문

Akka

예제로 보는 아카(akka) - 2. 생성 (Hello Akka) 및 메세지 수신

[하마] 이승현 (wowlsh93@gmail.com) 2016. 10. 4. 21:22

- Scala 2.11 기반 

- Akka 2.4.11 기반 

Learning Concurrent Programming in Scala 참고 


생성 (Hello Akka)

import akka.actor.{ ActorRef, ActorSystem, Props, Actor }
import akka.event.Logging


// 나의 액터 클래스
class Hello(val hello: String) extends Actor {
val log = Logging(context.system, this)

def receive = {
case `hello` => // 받은 메세지가 'hello' 라면
log.info(s"Received a $hello!")
case msg => // 받은 메세지가 아무것이라면
log.info(s"Unexpected message '$msg'")
context.stop(self)
}
}


object ActorsCreate extends App {

// 액터 시스템 생성 . 이름은 mysystem
val mySystem = ActorSystem("mysystem")

// 액터 시스템을 통하여 나의 Actor 생성. 이름은 greeter 타입은 ActorRef
val hiActor : ActorRef = mySystem.actorOf(Props(new Hello("hi")), name = "greeter")

// 나의 액터와 교신. 'hi' 라는 메세지를 보낸다. // Received a hi! 출력
hiActor ! "hi"
Thread.sleep(1000)

// 나의 액터와 교신. 3 이라는 메세지를 보낸다. // Unexpected message '3' 출력
hiActor ! 3
Thread.sleep(1000)

// 액터 시스템 종료
mySystem.terminate()
}

주석을 통하여 충분히 이해 가리라 본다.

액터시스템을 먼저 생성하고 그 액터 시스템에 우리가 만든 액터클래스를 객체화하여 등록시켜 사용하는것이다.액터 클래스에는 receive라는 메소드가 있는데 , 액터는 receive 를 통하여 메일박스로 부터 받은 메세지를 처리한다. receive 메소드는 PartialFunction[Any,Unit] 타입의 객체이다. Any 타입의 메세지를 받아서 처리한다.

부분함수란 ? 바로가기 

Props 객체는 액터 인스턴스를 만드는데 필요한 모든 정보를 캡슐화해 놓았다. (직렬화 가능하며, 네트워크를 통해 전송 가능)


메세지 수신

메세지 수신은 receive 메소드를 통해서 합니다.


def receive = {
case `hello` => // 받은 메세지가 'hello' 라면
log.info(s"Received a $hello!")
case msg => // 받은 메세지가 아무것이라면
log.info(s"Unexpected message '$msg'")
context.stop(self)
}

이렇게 'hello'문자열이 날라오는등 경우(case) 에 따라서 케이스 매칭 해줍니다.

아래는 케이스 클래스를 매칭 합니다. 좀 더 복잡한  receive 처리를 할 수 있겠지요.

case class ClassOne(x: Int, y: String) case class ClassTwo(a: Int, b: Option[ClassOne]) override def receive = { case ClassOne(x, y) => println(s"Received $x and $y") case ClassTwo(a, Some(ClassOne(x, y)) if a == 42 =>     // do something case ClassTwo(a, None) => case c @ ClassOne(_, "foo") => // only match if y == "foo", now c is your instance of ClassOne }


Comments