本节主要内容:

1. 停止Actor

1. 停止Actor

(1)通过ActorSystem.shutdown方法停止全部 Actor的执行

/*
*停止Actor:ActorSystem.shutdown方法
*/
object Example_10 extends App{
import akka.actor.Actor
import akka.actor.ActorSystem
import akka.actor.Props class FirstActor extends Actor with ActorLogging{ var child:ActorRef = context.actorOf(Props[MyActor], name = "myActor")
def receive = {
//向MyActor发送消息
case x => child ! x;log.info("received "+x)
}
override def postStop(): Unit = {
log.info("postStop In FirstActor")
}
} class MyActor extends Actor with ActorLogging{
def receive = {
case "test" => log.info("received test");
case _ => log.info("received unknown message");
}
override def postStop(): Unit = {
log.info("postStop In MyActor")
}
}
val system = ActorSystem("MyActorSystem")
val systemLog=system.log //创建FirstActor对象
val firstactor = system.actorOf(Props[FirstActor], name = "firstActor") systemLog.info("准备向firstactor发送消息")
//向firstactor发送消息
firstactor!"test"
firstactor! 123
//关闭ActorSystem,停止全部Acotr执行
system.shutdown()
}

代码执行结果:

[INFO] [04/02/2016 21:51:34.440] [main] [ActorSystem(MyActorSystem)] 准备向firstactor发送消息
[INFO] [04/02/2016 21:51:34.441] [MyActorSystem-akka.actor.default-dispatcher-4] [akka://MyActorSystem/user/firstActor/myActor] received test
[INFO] [04/02/2016 21:51:34.441] [MyActorSystem-akka.actor.default-dispatcher-2] [akka://MyActorSystem/user/firstActor] received test
[INFO] [04/02/2016 21:51:34.441] [MyActorSystem-akka.actor.default-dispatcher-2] [akka://MyActorSystem/user/firstActor] received 123
[INFO] [04/02/2016 21:51:34.441] [MyActorSystem-akka.actor.default-dispatcher-4] [akka://MyActorSystem/user/firstActor/myActor] received unknown message
[INFO] [04/02/2016 21:51:34.446] [MyActorSystem-akka.actor.default-dispatcher-4] [akka://MyActorSystem/user/firstActor/myActor] postStop In MyActor
[INFO] [04/02/2016 21:51:34.447] [MyActorSystem-akka.actor.default-dispatcher-5] [akka://MyActorSystem/user/firstActor] postStop In FirstActor

(2)通过context.stop方法停止Actor的执行

/*
*停止Actor:context.stop方法
*/
object Example_11 extends App{
import akka.actor.Actor
import akka.actor.ActorSystem
import akka.actor.Props class FirstActor extends Actor with ActorLogging{ var child:ActorRef = context.actorOf(Props[MyActor], name = "myActor")
def receive = {
case "stop"=>context.stop(child)
case x =>{
//向MyActor发送消息
child ! x
log.info("received "+x)
} }
override def postStop(): Unit = {
log.info("postStop In FirstActor")
}
} class MyActor extends Actor with ActorLogging{
def receive = {
case "test" => log.info("received test");
case _ => log.info("received unknown message");
}
override def postStop(): Unit = {
log.info("postStop In MyActor")
}
}
val system = ActorSystem("MyActorSystem")
val systemLog=system.log //创建FirstActor对象
val firstactor = system.actorOf(Props[FirstActor], name = "firstActor") systemLog.info("准备向firstactor发送消息")
//向firstactor发送消息
firstactor!"test"
firstactor! 123
firstactor!"stop" }

代码执行结果:

[INFO] [04/02/2016 22:02:48.760] [main] [ActorSystem(MyActorSystem)] 准备向firstactor发送消息
[INFO] [04/02/2016 22:02:48.761] [MyActorSystem-akka.actor.default-dispatcher-5] [akka://MyActorSystem/user/firstActor/myActor] received test
[INFO] [04/02/2016 22:02:48.761] [MyActorSystem-akka.actor.default-dispatcher-2] [akka://MyActorSystem/user/firstActor] received test
[INFO] [04/02/2016 22:02:48.762] [MyActorSystem-akka.actor.default-dispatcher-2] [akka://MyActorSystem/user/firstActor] received 123
[INFO] [04/02/2016 22:02:48.762] [MyActorSystem-akka.actor.default-dispatcher-5] [akka://MyActorSystem/user/firstActor/myActor] received unknown message
[INFO] [04/02/2016 22:02:48.763] [MyActorSystem-akka.actor.default-dispatcher-5] [akka://MyActorSystem/user/firstActor/myActor] postStop In MyActor

代码的重点为

class FirstActor extends Actor with ActorLogging{

    var child:ActorRef = context.actorOf(Props[MyActor], name = "myActor")
def receive = {
case "stop"=>context.stop(child)
case x =>{
//向MyActor发送消息
child ! x
log.info("received "+x)
} }
override def postStop(): Unit = {
log.info("postStop In FirstActor")
}
}

中的case “stop”=>context.stop(child),直接通过context.stop方法停止Actor的执行。注意程序中并没有使用system.shutdown方法,因此整个程序的不会停止,例如以下图所看到的

(3)通过akka.actor.PoisonPill消息停止Actor的执行

/*
*停止Actor:使用akka.actor.PoisonPill
*/
object Example_12 extends App{
import akka.actor.Actor
import akka.actor.ActorSystem
import akka.actor.Props
import akka.actor.PoisonPill class FirstActor extends Actor with ActorLogging{ var child:ActorRef = context.actorOf(Props[MyActor], name = "myActor")
def receive = {
//向child发送PoisonPill停止其执行
case "stop"=>child!PoisonPill
case x =>{
//向MyActor发送消息
child ! x
log.info("received "+x)
} }
override def postStop(): Unit = {
log.info("postStop In FirstActor")
}
} class MyActor extends Actor with ActorLogging{
def receive = {
case "test" => log.info("received test");
case _ => log.info("received unknown message");
}
override def postStop(): Unit = {
log.info("postStop In MyActor")
}
}
val system = ActorSystem("MyActorSystem")
val systemLog=system.log //创建FirstActor对象
val firstactor = system.actorOf(Props[FirstActor], name = "firstActor") systemLog.info("准备向firstactor发送消息")
//向firstactor发送消息
firstactor!"test"
firstactor! 123
firstactor!"stop" }

代码执行结果:

[INFO] [04/02/2016 22:12:09.947] [main] [ActorSystem(MyActorSystem)] 准备向firstactor发送消息
[INFO] [04/02/2016 22:12:09.947] [MyActorSystem-akka.actor.default-dispatcher-2] [akka://MyActorSystem/user/firstActor/myActor] received test
[INFO] [04/02/2016 22:12:09.947] [MyActorSystem-akka.actor.default-dispatcher-4] [akka://MyActorSystem/user/firstActor] received test
[INFO] [04/02/2016 22:12:09.947] [MyActorSystem-akka.actor.default-dispatcher-4] [akka://MyActorSystem/user/firstActor] received 123
[INFO] [04/02/2016 22:12:09.947] [MyActorSystem-akka.actor.default-dispatcher-2] [akka://MyActorSystem/user/firstActor/myActor] received unknown message
[INFO] [04/02/2016 22:12:09.951] [MyActorSystem-akka.actor.default-dispatcher-4] [akka://MyActorSystem/user/firstActor/myActor] postStop In MyActor

代码与Exampel_11中的不同之处在于

//向child发送PoisonPill停止其执行
case "stop"=>child!PoisonPill

它使用不是context.stop方法,而是向MyActor发送了PoisonPill消息,其他代码不变。

另一种gracefulStop方法能够停止Actor的执行,这部分内容等了解完Future类的作用原理之后再来讨论



Scala学习(公众微信号:ScalaLearning)每天为大家带来一点Scala语言、Spark、Kafka、Flink、AKKA等大数据技术干货及相关技术资讯。技术永无止境。勇攀高峰,一往直前!

认为文章不错?扫描关注

最新文章

  1. Linux下的几个好用的命令与参数
  2. 如何修复Outlook 2007源文件.PST及性能优化补丁
  3. canvas,制作炫酷的时钟和倒计时
  4. iOS开发笔记12:iOS7上UITextField限制字数输入导致崩溃问题
  5. java编译错误:varargs 方法的非 varargs 调用
  6. WScript中调用js方法
  7. OpenGl入门——视口及物体移动函数
  8. BZOJ 1640: [Usaco2007 Nov]Best Cow Line 队列变换
  9. IAR中 C语言位定义
  10. Java随机数生成原理--转稿
  11. 【转】C#实现MD5加密
  12. 编译OpenGL代码时发生 Inconsistency detected by ld.so: dl-version.c: 224: _dl_check_map_versions: Assertion `needed != ((void *)0)' failed! 错误的解决方案
  13. libsvn_subr-1.so.0: undefined symbol: apr_atomic_xchgptr 故障解决
  14. HDU 1060 Leftmost Digit 基础数论
  15. Can't get Kerberos realm
  16. python3 得到a.txt中有的而b.txt中没有的汉字
  17. 安卓getSystemService
  18. javascript fundamental concept
  19. LSOF 安装与使用(功能强大)
  20. 【WIP】iOS UIKit

热门文章

  1. css 样式通用样式
  2. fedora安装gcc
  3. scrapy 的分页爬取 CrawlSpider
  4. dom监听事件class
  5. php更改wampserver的站点目录
  6. JAVA基础——数据流
  7. Python飞机大战实例有感——pygame如何实现“切歌”以及多曲重奏?
  8. [Python3网络爬虫开发实战] 3.1.4-分析Robots协议
  9. Python-基本图形绘制及库引用
  10. java中"=="和equals方法究竟有什么区别?