Ping Pong example in Akka

지난 Post에서는 아카로 Hello World를 출력해 보았습니다. 이번에는 한 단계 나아가서, 두 개의 액터가 서로 ping과 pong 메시지를 반복하는 코드를 작성해 보겠습니다.

먼저 Akka를 사용하기 위해 Dependency설정을 해 줍니다. 아래 내용을 build.sbt 파일에 추가합니다.

libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.5.3"

참고로 지난 Post에서 Hello World 찍었을 때와는 libraryDependencies에 쓰는 버전이 달라졌습니다. 그 사이 아카의 새 버전이 나왔는데요, 여기서는 최신 버전을 사용하느라 버전의 숫자가 조금 다른 것입니다.

PingPong.scala 파일을 만들어 아래처럼 작성해 봅니다.

코드를 살펴보겠습니다. 먼저 코드의 흐름에 따라 main 메소드 부터 시작해 보겠습니다. main 메소드에서는 액터시스템을 만들고 PingActor를 만든 후, 만든 PingActor에게 “start”라는 메시지를 전달합니다. 여기까지는 이전 Post에 있는 Hello World와 그닥 다를 것이 없어 보입니다.

다음은 PingActor 클래스 입니다. 여기서는 화면에 출력하기 위해 log 객체를 만들었습니다(line 14). log 객체는 akka.event.Logging 타입으로 맨 윗부분에 import 된 것을 확인할 수 있습니다.

PingActor 안에서 PongActor를 만드는 구문이 있습니다(line 15). main 메소드에서는 ActorSystem에서 액터를 만들었는데요, 여기서는 context에서 액터를 만드는 것을 확인할 수 있습니다. context란 해당 액터에 관점에서 보이는 ActorSystem이라고 생각하시면 됩니다.

PongActor는 PingActor와 다르게 클래스를 만들 때 ActorRef 타입의 생성 인자가 필요합니다. 이 생성 인자는 액터를 만들 때 전달하는 Props 객체 안에 넣어 전달합니다. 위 코드에서는 자기 자신을 나타내는 self를 생성 인자로 넘겨주었습니다. 참고로 Props에 인자를 넘겨주는 방법은 아래 Box 와 같습니다.

val props = Props[MyActor]
val props = Props(classOf[MyActor], arg1, arg2)

PingActor에서는 받은 메시지를 출력하고, PongActor로 “ping” 이라는 메시지를 넘겨줍니다. PongActor 역시 마찬가지입니다. 다만 ping과 pong이 너무 빨리 반복되어 편의상 Thread.sleep을 이용해 1초 쉬도록 처리했습니다.

위 코드를 실행하면 아래와 같습니다.

Show your support

Clapping shows how much you appreciated ahaljh’s story.