akka初学2
来源:互联网 发布:coc5级女武神升级数据 编辑:程序博客网 时间:2024/06/06 00:52
这里还有一个更复杂的例子,涉及到两个actor的交互。 就像两个人在乒乒乓乓的打乒乓球。 两个actor来回的ping pang,直到达到特定的次数才停止。
这里定义了两个actor: Ping和Pang。
Ping 接收StartMessage和 PongMessage。 StartMessage是一个启动消息,由main对象发送,PongMessage来自Pong actor,如果次数还未达到,它继续发送PingMessage。Pong 接收StopMessage和 PingMessage。 如果接收到PingMessage,它就发送一个PongMessage, 如果是StopMessage, 停止ActorSystem
这里调用了Ping的带参数的构造函数 Props(new Ping(pong))
package akka.scala.liuweiimport akka.actor.{Actor, ActorRef, ActorSystem, Props}case object PingMessagecase object PongMessagecase object StartMessagecase object StopMessage/** * Created by liuwei on 2017/5/12. */class Ping(pong:ActorRef) extends Actor { var count = 0 def incrementAndPrint {count += 1; println(s"$count:ping")} def receive: Receive = { case StartMessage => incrementAndPrint pong ! PongMessage case PingMessage => incrementAndPrint if(count > 9) { sender ! StopMessage println("ping stopped") context.stop(self) } else sender ! PongMessage case _ => println("Ping got unexpected information") }}class Pong extends Actor { var count = 0 def receive = { case StopMessage => println("pong stopped") //context.stop方法来结束 context.stop(self) case PongMessage => count += 1 println(s"$count:pong") sender ! PingMessage case _ => println("Pong got unexpected information") }}object PingPangTest extends App{ val system = ActorSystem("PingPongTest") //创建Pong的actor实例(pongActor对象其实是ActorRef的实例); val pongActor = system.actorOf(Props[Pong], name="pong") // Ping的actor实例,其构造函数接受ActorRef参数; val pingActor = system.actorOf(Props(new Ping(pongActor)), name = "ping") //通过给pingActor发送一个StartMessage消息来启动pingActor和pongActor的具体动作 pingActor ! StartMessage}
在ActorSystem层面,通过调用system.actorOf
方法来创建actors;在actor内部,通过调用context.actorOf
方法来创建子actor
package akka.scalaimport akka.actor.{Actor, ActorSystem, PoisonPill, Props}/** * Created by liuwei on 2017/5/10. */case class CreateChild (name: String)case class Name (name: String)class Child extends Actor { var name = "No name" /** * 关闭文件或数据库连接 */ override def postStop: Unit = { println(s"D'oh! They killed me ($name): ${self.path}") } def receive = { case Name(name) => this.name = name case _ => println(s"Child $name got message.") }}class Parent extends Actor { def receive = { case CreateChild(name) => // Parent creates a new Child here println(s"Parent about to create Child ($name) ...") //创建子actor val child = context.actorOf(Props[Child], name=s"$name") child ! Name(name) case _ => println(s"Parent got some other message.") }}object ParentChildDemo extends App{ val actorSystem = ActorSystem("ParentChildTest") val parent = actorSystem.actorOf(Props[Parent], name="Parent") // send messages to Parent to create to child actors parent ! CreateChild("XiaoMing") parent ! CreateChild("XiaoLiang") Thread.sleep(500) // lookup XiaoMing, the kill it println("Sending XiaoMing a PoisonPill ... ") val xiaoming = actorSystem.actorSelection("/user/Parent/XiaoMing") /** * PoisonPill和gracefulStop还有其他两种方式,发送PoisonPill消息或者使用gracefulStop终止。你也可以向actor发送akka.actor.PoisonPill消息,这个消息处理完成后actor会被终止。PoisonPill与普通消息一样被放进队列,因此会在已经入队列的其它消息之后被执行。 */ xiaoming ! PoisonPill println("XiaoMing was killed") Thread.sleep(5000) actorSystem.terminate()}
0 0
- akka初学2
- Akka初学1
- Akka历史和亮点(Akka 2)
- Akka in 2 weeks
- Akka
- Akka
- Akka
- Akka
- Akka学习笔记(2)
- Akka边学边写(2)-- Echo Server
- Akka学习笔记(2)-ActorSystem
- Akka学习笔记:Actor消息传递(2)
- Akka(2):Actor生命周期管理
- Scala---Akka Actor(一)tutorial-2
- Akka介绍(Akka 1)
- Python初学之初学2
- scala akka 修炼之路2(文件操作)
- [翻译]AKKA笔记 - LOGGING与测试ACTORS -2 (一)
- iOS开发之pch文件创建并且设置为相对路径
- 网页中嵌入pdf在线浏览(支持IE8及其以上版本浏览器)
- C函数调用过程解析(x86-64 )
- 基于NDK编译ffmpeg库
- 07_用两个栈实现队列
- akka初学2
- Redis的主从配置
- jsp中比较数值精度丢失问题
- Python 中用 matplotlib 画散列点 (Scatter)
- 虚拟机配置共享磁盘
- revit隐藏线
- python_car_可视化
- 【算法】程序猿不写代码是不对的54
- A robot with a view—how drones and machines can navigate on their own [video]