가장 기본적인 Actor의 설계방법을 살펴보겠습니다.
Actor에대한 이론적인 설명은 앞장에서 했기때문에 생략하겠습니다.
Actor에 대한 사용패턴/컨셉은 언어/플래폼이 틀려도 큰 차이가 없습니다.
다음과 같은 간단한 액트를 설계해보자
- 인사를 받아주는 액트(Greeter)
- 인사에 반응하여 로그를 찍는 액트( Printer)
Greeter
package com.psmon.akka.study; import com.psmon.akka.study.Printer.Greeting; import akka.actor.AbstractActor; import akka.actor.ActorRef; import akka.actor.Props; //#greeter-messages public class Greeter extends AbstractActor { //#greeter-messages static public Props props(String message, ActorRef printerActor) { return Props.create(Greeter.class, () -> new Greeter(message, printerActor)); } //#greeter-messages static public class WhoToGreet { public final String who; public WhoToGreet(String who) { this.who = who; } } static public class Greet { public Greet() { } } //#greeter-messages private final String message; private final ActorRef printerActor; private String greeting = ""; public Greeter(String message, ActorRef printerActor) { this.message = message; this.printerActor = printerActor; } @Override public Receive createReceive() { return receiveBuilder() .match(WhoToGreet.class, wtg -> { this.greeting = message + ", " + wtg.who; }) .match(Greet.class, x -> { //#greeter-send-message printerActor.tell(new Greeting(greeting), getSelf()); //#greeter-send-message }) .build(); } //#greeter-messages } //#greeter-messages
GreeterPrinter
package com.psmon.akka.study; import akka.actor.AbstractActor; import akka.actor.ActorRef; import akka.actor.Props; import akka.event.Logging; import akka.event.LoggingAdapter; //#printer-messages public class Printer extends AbstractActor { //#printer-messages static public Props props() { return Props.create(Printer.class, () -> new Printer()); } //#printer-messages static public class Greeting { public final String message; public Greeting(String message) { this.message = message; } } //#printer-messages private LoggingAdapter log = Logging.getLogger(getContext().getSystem(), this); public Printer() { } @Override public Receive createReceive() { return receiveBuilder() .match(Greeting.class, greeting -> { log.info(greeting.message); }) .build(); } //#printer-messages } //#printer-messages
수행
package com.psmon.akka.study; import akka.actor.ActorRef; import akka.actor.ActorSystem; import java.io.IOException; import com.psmon.akka.study.Greeter.*; public class AkkaQuickstart { public static void main(String[] args) { final ActorSystem system = ActorSystem.create("helloakka"); try { //#create-actors final ActorRef printerActor = system.actorOf(Printer.props(), "printerActor"); final ActorRef howdyGreeter = system.actorOf(Greeter.props("Howdy", printerActor), "howdyGreeter"); final ActorRef helloGreeter = system.actorOf(Greeter.props("Hello", printerActor), "helloGreeter"); final ActorRef goodDayGreeter = system.actorOf(Greeter.props("Good day", printerActor), "goodDayGreeter"); //#create-actors //#main-send-messages howdyGreeter.tell(new WhoToGreet("Akka"), ActorRef.noSender()); howdyGreeter.tell(new Greet(), ActorRef.noSender()); howdyGreeter.tell(new WhoToGreet("Lightbend"), ActorRef.noSender()); howdyGreeter.tell(new Greet(), ActorRef.noSender()); helloGreeter.tell(new WhoToGreet("Java"), ActorRef.noSender()); helloGreeter.tell(new Greet(), ActorRef.noSender()); goodDayGreeter.tell(new WhoToGreet("Play"), ActorRef.noSender()); goodDayGreeter.tell(new Greet(), ActorRef.noSender()); //#main-send-messages System.out.println(">>> Press ENTER to exit <<<"); System.in.read(); } catch (IOException ioe) { } finally { system.terminate(); } } }