大数据系列修炼-Scala课程111

大数据系列修炼-Scala课程111

核心内容:
1、Akka中的Actor中用become和unbecome动态切换receive的具体处理逻辑实战

1、Akka中的Actor中用become和unbecome动态切换receive的具体处理逻辑实战

1>Akka中的Actor在具体处理业务时有一个非常有用的特性,可以动态切换Actor的业务逻辑代码
2>正常情况下,Actor中的receive方法会根据消息的具体类型进行业务的逻辑处理,然而我们可以根据Akka提供的become和unbecome机制来
动态的切换当前Actor的处理逻辑。
become的含义:将处理代码切换成自己所在的逻辑。
unbecome的含义:将执行的代码逻辑在切换一次。
3>self ! Spark 给自己所在的Actor发送消息 Context.stop(self)将自己所在的Actor停止。

实例程序1:

import akka.actor.{Actor, ActorSystem, Props}


case class Spark
case class Flink
class SparkFlinkActor extends Actor
{
  import context._   //看来只有继承Actor才可以导入context 呵呵了
  //上面的导入是为了引入become和unbecome
  var count = 0  //参考之用
  override  def receive =
  {
      case Spark =>
      {
          println("Here is Spark!!!")
          count = count + 1  //scala已经不用++了,看来++果然不行啊
          Thread.sleep(100)
          self ! Flink  //给自己:SparkFlinkActor发送消息,一个Actor是可以给自己发送消息的
          become
          {
              case Flink =>
              {
                 println("Here is Flink!!")
                 count = count + 1
                 Thread.sleep(100)
                 self ! Spark
                 unbecome()  //动态的切换执行逻辑
              }
          }
          if(count > 10) context.stop(self)   //注意if的位置
      }
  }
}
object HelloAkka
{
  def main(args: Array[String]): Unit =
  {
     val system = ActorSystem.create("BecomeUnbecome")  //创建一个ActorSystem容器
     val sparkFlinkActor = system.actorOf(Props[SparkFlinkActor])   //创建一个子Actor
     //下面的消息中Spark竟然不用指明数据类型
     sparkFlinkActor ! Spark //主线程所在的Actor给下面的Actor发送消息
     Thread.sleep(2000)
     system.shutdown()
  }
}

上面的程序运行之后,还是抛出了之前出现过的异常,我将Jdk32位的换成了Jdk64位的,但是还是没有解决,无语啊!
如有问题,欢迎留言指正!

你可能感兴趣的:(scala,大数据)