Page History
Info |
---|
가장 기본적인 Actor의 설계방법을 살펴보겠습니다. Actor에대한 이론적인 설명은 앞장에서 했기때문에 생략하겠습니다. Actor에 대한 사용패턴/컨셉은 언어/플래폼이 틀려도 큰 차이가 없습니다. |
다음과 같은 간단한 액트를 설계해보자
- 인사를 받아주는 액트(Greeter)
- 인사에 반응하여 로그를 찍는 액트( Printer)
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
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
|
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
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 |
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
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();
}
}
}
|
Expand | ||
---|---|---|
| ||
[INFO] [10/31/2017 15:33:29.692] [helloakka-akka.actor.default-dispatcher-3] [akka://helloakka/user/printerActor] Good day, Play |