核心内容:
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位的,但是还是没有解决,无语啊!
如有问题,欢迎留言指正!