本将主要内容:
1. Actor引用、Actor路径
1. Actor引用、Actor路径
下图是Akka官方文档中给出的一张图
该图清晰地说明了ActorPath,ActorRef,Actor及ActorSystem之间的关系,并说明了Actor整体的层次结构。前面我们提到,Akka应用程序会持有一个名称为user的Actor,该Actor被称为guardian supervisor(守卫监督器),无论是ActorSystem创建的Actor还是通过ActorContext创建的Actor都为user的子类,它是最顶级的Actor。
(一)ActorRef
对于ActorRef,我们已经很熟悉了,通过调用ActorSystem.actorOf方法可以创建Actor,返回的便是ActorRef,例如代码
//创建FirstActor对象
val myactor = system.actorOf(Props[FirstActor], name = "firstActor")
返回的便是FirstActor的ActorRef对象,ActorRef最重要的作用便是向Actor发送消息,例如
//向myactor发送消息
myactor!"test"
myactor! 123
另外,还可以通过context隐式对象获取父Actor和子Actor的ActorRef,示例代码如下:
/*
*Actor API:成员变量self及sender()方法的使用
*/
object Example_07 extends App{
import akka.actor.Actor
import akka.actor.ActorSystem
import akka.actor.Props
class FirstActor extends Actor with ActorLogging{
//通过context.actorOf方法创建Actor
var child:ActorRef = _
override def preStart(): Unit ={
log.info("preStart() in FirstActor")
//通过context上下文创建Actor
child = context.actorOf(Props[MyActor], name = "myActor")
}
def receive = {
//向MyActor发送消息
case x => child ! x;log.info("received "+x)
}
}
class MyActor extends Actor with ActorLogging{
var parentActorRef:ActorRef=_
override def preStart(): Unit ={
//通过context.parent获取其父Actor的ActorRef
parentActorRef=context.parent
}
def receive = {
case "test" => log.info("received test");parentActorRef!"message from ParentActorRef"
case _ => log.info("received unknown message");
}
}
val system = ActorSystem("MyActorSystem")
val systemLog=system.log
//创建FirstActor对象
val myactor = system.actorOf(Props[FirstActor], name = "firstActor")
//获取ActorPath
val myActorPath=system.child("firstActor")
//通过system.actorSelection方法获取ActorRef
val myActor1=system.actorSelection(myActorPath)
systemLog.info("准备向myactor发送消息")
//向myActor1发送消息
myActor1!"test"
myActor1! 123
Thread.sleep(5000)
//关闭ActorSystem,停止程序的运行
system.shutdown()
}
代码运行结果
[INFO] [04/02/2016 20:28:08.941] [MyActorSystem-akka.actor.default-dispatcher-4] [akka://MyActorSystem/user/firstActor] preStart() in FirstActor
[INFO] [04/02/2016 20:28:08.942] [main] [ActorSystem(MyActorSystem)] 准备向myactor发送消息
[INFO] [04/02/2016 20:28:08.943] [MyActorSystem-akka.actor.default-dispatcher-3] [akka://MyActorSystem/user/firstActor] received test
[INFO] [04/02/2016 20:28:08.943] [MyActorSystem-akka.actor.default-dispatcher-3] [akka://MyActorSystem/user/firstActor] received 123
[INFO] [04/02/2016 20:28:08.943] [MyActorSystem-akka.actor.default-dispatcher-4] [akka://MyActorSystem/user/firstActor/myActor] received test