在开始讨论Akka中对Actor的生命周期管理前,我们先探讨一下所谓的Actor编程模式。对比起我们习惯的行令式(imperative)编程模式,Actor编程模式更接近现实中的应用场景和功能测试模式。这是因为Actor是靠消息来驱动的,每种消息代表一项功能的运算指令。由于消息驱动式的程序是松散耦合的,每项功能都是在独立的线程中运算,互不干扰依赖,所以我们可以很自然的分开来实现各项功能以及独立测试每项功能。虽然Akka同时提供了Java和Scala两种API,但可能由于Akka本身是用Scala开发的,所以感觉用Scala来开发Akka程序会更自然些:笼统来讲,Actor编程主要就是对receive函数的实现。而receive函数就是几个普通的功能函数用模式匹配的方式按消息类型进行调用。receive函数所调用的功能函数可以是任何JVM兼容语言函数,由于每个Actor的运算都在自己独立的线程里进行,所以我们不必担心Actor函数在运行中的交叉调用问题。Akka程序本就是一种原生的多线程程序,每个Actor都在一个自己的线程内独立运算它的receive函数。除此之外Actor的运算环境可以在任何不同的JVM里,只要Akka信息发送能实现跨JVM投递的话,实现分布式程序也是自然而然的事了。所以,理论上Akka编程初学者应该把主要注意力放在这个receive函数的实现上来,按照一种模版式的方式来编写Akka程序就可以了,如下面演示的这个模版例子:
import akka.actor._object MyActor { //在这个伴生对象里申明MyActor所支持的功能指令 sealed trait ActorCommands case object RunFuncA extends ActorCommands case object RunFuncB extends ActorCommands }//假设有funcA,funcB. 它们可以从任何JVM函数库里调用val funcA : () => Any = ???val funcB : () => Any = ???class MyActor extends Actor { import MyActor._ var stateValue: Any = _ //内部状态,代表这个Actor的当前运算结果 override def receive: Receive = { case RunFuncA => stateValue = funcA //运算funcA,更新stateValue case RunFuncB => stateValue = funcB //运算funcB,更新stateValue ... } }
延伸阅读
学习是年轻人改变自己的最好方式