zoukankan      html  css  js  c++  java
  • Akka并发编程——第五节:Actor模型(四)

    本节主要内容:
    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等大数据技术干货及相关技术资讯。技术永无止境。勇攀高峰,一往直前!
    认为文章不错?扫描关注

    这里写图片描写叙述

  • 相关阅读:
    一起谈.NET技术,用PagePaser创建Page作为HttpHandler 狼人:
    一起谈.NET技术,Visual Studio 2010构建Web浏览器应用程序 狼人:
    一起谈.NET技术,C#中的lock关键字 狼人:
    一起谈.NET技术,OnLoad与Page_Load的差异分析 狼人:
    一起谈.NET技术,使用LINQ Expression构建Query Object 狼人:
    一起谈.NET技术,Visual Studio 2008单元测试_数据库测试 狼人:
    一起谈.NET技术,ASP.NET绑定的技巧 狼人:
    动态加载js和css
    错误:该行已经属于另一个表
    c#中转义符总结
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7146265.html
Copyright © 2011-2022 走看看