要定义自己的Actor类,需要继承Actor并实现receive方法。receive方法需要定义一系列case语句(类型为PartialFunction[Any,Unit]),来描述Actor能够处理哪些消息(使用标准的Scala模式匹配),以及实现对消息如何进行处理的代码。例10-1是一个简单的Akka Actor示例,该示例中通过继承akka.actor.Actor来构建Actor,Test继承自Actor,在其receive方法中匹配并打印信息。
【例10-1】实现Actor Trait编写Actor程序示例。
运行结果如图10-3所示。
图10-3 通过继承Actor实现Actor
请注意,Akka Actor receive消息循环是“无穷尽的(exhaustive)”,这与Erlang和Scala的Actor行为不同。在receive方法中,需要提供一个对它能够接受消息的匹配规则,如果希望处理未知的消息,需要像上例一样提供一个缺省的case分支,否则会有akka.actor.UnhandledMessage(message,sender,recipient)被发布到Actor系统(ActorSys⁃tem)的事件(EventStream)中。(www.daowen.com)
在上面的例子中,actorOf的调用将返回一个实例的引用,这个引用是Actor的访问句柄,可以用它来与实际的Actor进行交互。ActorRef是不可变量,与它所代表的Actor之间是一对一的关系。ActorRef还是可序列化的(serializable),并且携带网络信息。这意味着可以在将它序列化以后,通过网络进行传送,在远程主机上它仍然代表原结点上的同一个Actor。
在上面的例子中,Actor是从系统创建的。也可以在其他的Actor中,使用Actor上下文(context)来创建,其中的区别在于监管树的组织方式。使用上下文时当前Actor将成为其创建子Actor的监管者。而使用系统创建的Actor将成为顶级Actor,它由系统(内部监管Actor)来监管。
例10-2使用Actor的context创建Actor例子,其实现和例10-1类似的功能,区别在于此处构建了两个Actor,分别是FirstActor和Test,其中FirstActor由ActorSystem创建,而Test则是在FirstActor内部创建的,此时FirstActor是Test的监管者。FirstActor将向Test发送消息,Test接收匹配并打印出消息。完整代码如下所示。
【例10-2】使用Actor的context创建Actor示例。
Actor在创建后将自动异步地启动。当创建Actor时它会自动调用Actor trait的preStart回调方法,这是一个非常好的用来添加Actor初始化代码的位置。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。