akka java quick start_Akka Quickstart with Java-笔记(示例代码)

官方文档: http://developer.lightbend.com/guides/akka-quickstart-java/?_ga=2.177525157.1012573474.1504767665-546319647.1504766934

一. AKKA Hello World example :

1.首先需要创建一个ActorSystem, 它是所有Actor运行的容器.

2.其次创建Greeter Actor和Printer Actor.

3.发送消息到Greeter Actor实例, 它们会先在内部存储消息.

4.最后Greeter Actor里面的指令消息会触发它们发送消息给Printer Actor, 然后Printer Actor会执行对应的操作.

20180111003207035256.png

20180111003207038186.png

二. 定义Actors和messages

messages可以是任意类型(any subtype of Object).

当定义Actors和它们的messages时, 要遵守以下规范:

1.因为messages是Actor的公共API, 所以给messages定义名称的时候要富含语义以及特定领域的意义.

2.messages是不可变的, 因为它们在不同的线程之间共享.

3.把Actor相关的messages作为静态内部类放到Actor类中, 这样更容易理解actor需要处理什么类型的消息.

4.在Actor类中, 使用静态方法props描述如何构造Actor.

1 packagecom.lightbend.akka.sample;2

3 importakka.actor.AbstractActor;4 importakka.actor.ActorRef;5 importakka.actor.Props;6 importcom.lightbend.akka.sample.Printer.Greeting;7

8 public class Greeter extendsAbstractActor {9 static publicProps props(String message, ActorRef printerActor) {10 return Props.create(Greeter.class, () -> newGreeter(message, printerActor));11 }12

13 static public classWhoToGreet {14 public finalString who;15

16 publicWhoToGreet(String who) {17 this.who =who;18 }19 }20

21 static public classGreet {22 publicGreet() {23 }24 }25

26 private finalString message;27 private finalActorRef printerActor;28 private String greeting = "";29

30 publicGreeter(String message, ActorRef printerActor) {31 this.message =message;32 this.printerActor =printerActor;33 }34

35 @Override36 publicReceive createReceive() {37 returnreceiveBuilder()38 .match(WhoToGreet.class, wtg ->{39 this.greeting = message + ", " +wtg.who;40 })41 .match(Greet.class, x ->{42 printerActor.tell(newGreeting(greeting), getSelf());43 })44 .build();45 }46 }

1 packagecom.lightbend.akka.sample;2

3 importakka.actor.AbstractActor;4 importakka.actor.ActorRef;5 importakka.actor.Props;6 importakka.event.Logging;7 importakka.event.LoggingAdapter;8

9 public class Printer extendsAbstractActor {10 static publicProps props() {11 return Props.create(Printer.class, () -> newPrinter());12 }13

14 static public classGreeting {15 public finalString message;16

17 publicGreeting(String message) {18 this.message =message;19 }20 }21

22 private LoggingAdapter log = Logging.getLogger(getContext().getSystem(), this);23

24 publicPrinter() {25 }26

27 @Override28 publicReceive createReceive() {29 returnreceiveBuilder()30 .match(Greeting.class, greeting ->{31 log.info(greeting.message);32 })33 .build();34 }35 }

三.创建Actor对象

Actor不能用过new来创建, 而是通过工厂来创建Actor对象, 工厂返回的不是actor实例, 而是一个引用akka.actor.ActorRef, 这个引用指向actor实例.

akka.actor.ActorSystem类似于Spring的BeanFactory. 它作为Actor的容器, 管理actor的生命周期. 工厂方法actorOf通过两个参数创建Actor对象, 一个参数是配置对象Props, 一个参数是actor的名称.

1 final ActorRef printerActor =

2 system.actorOf(Printer.props(), "printerActor");3 final ActorRef howdyGreeter =

4 system.actorOf(Greeter.props("Howdy", printerActor), "howdyGreeter");5 final ActorRef helloGreeter =

6 system.actorOf(Greeter.props("Hello", printerActor), "helloGreeter");7 final ActorRef goodDayGreeter =

8 system.actorOf(Greeter.props("Good day", printerActor), "goodDayGreeter");

四. 异步通信

Actor是响应式的和消息驱动的. 一个Actor不会做任何事情知道它接收到一个消息.Actors通过异步消息来通信. 这确保了消息的发送者(sender)不用停下来等待它们的消息被接受者(recipient)处理. 相反的, 发送者只要把消息放到接收者的邮筒(mailbox)里后就可以去干别的事了. 而这个邮筒本子上是一个有序的消息队列. 来自同一个Actor的多条消息是有序的, 而来自不同的Actor的消息是交错的.

当actor不处理消息的时候是处于一个暂停的状态, 此时它不消耗除内存以外的任何资源.

五. 发送消息到Actor

把消息放到Actor的邮筒(mailbox)里, 需要调用ActorRef的tell方法.  举个栗子:

把消息发送给Greeter Actor :

1 howdyGreeter.tell(new WhoToGreet("Akka"), ActorRef.noSender());2 howdyGreeter.tell(newGreet(), ActorRef.noSender());3

4 howdyGreeter.tell(new WhoToGreet("Lightbend"), ActorRef.noSender());5 howdyGreeter.tell(newGreet(), ActorRef.noSender());6

7 helloGreeter.tell(new WhoToGreet("Java"), ActorRef.noSender());8 helloGreeter.tell(newGreet(), ActorRef.noSender());9

10 goodDayGreeter.tell(new WhoToGreet("Play"), ActorRef.noSender());11 goodDayGreeter.tell(new Greet(), ActorRef.noSender());

Greeter Actor给Printer Actor发送消息:

printerActor.tell(new Greeting(greeting), getSelf());

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值