package sparkcontext_actor
import akka.actor.{ActorSystem, Props}
//akka的actor可以实现spark的常驻
import scala.io.StdIn
/*
创建actorsystem一个实例,然后由实例创建一个子actor--> as.actorof 返回的是一个actor的代理 actorref,
由actorref与actor交互
*/
object Student extends App{
/*1.创建ActorSystem
//ActorSystem作为顶级Actor,可以创建和停止Actors,甚至可关闭整个Actor环境,
//此外Actors是按层次划分的,ActorSystem就好比Java中的Object对象,Scala中的Any,
//是所有Actors的根,当你通过ActorSystem的actof方法创建Actor时,实际就是在ActorSystem
下创建了一个子Actor*/
val as = ActorSystem.apply()
//通过ActorSystem创建TeacherActor的代理(ActorRef),即通这个actorsystem创建子actor角色
// def actorOf(props: Props): ActorRef
val myActor = as.actorOf(Props(new MyActor(new Teacher("lc"))))
//ActorSystem通过actorOf创建Actor,但其并不返回TeacherActor而是返回一个类型为ActorRef的东西,
//ActorRef作为Actor的代理,使得客户端并不直接与Actor对话,这种Actor
//模型也是为了避免TeacherActor的自定义/私有方法或变量被直接访问,所
//以你最好将消息发送给ActorRef,由它去传递给目标Actor
// 发送QuoteRequest消息到代理中.你只需通过!方法将QuoteReques消息发送给ActorRef(注意:ActorRef也有个tell方法,其作用就委托回调给!)
while (true){
val line = StdIn.readLine()
myActor ! line
}
}
=======================================
package sparkcontext_actor
import akka.actor.Actor
//这里继承actor必须要实现一个方法 receive方法,,,
class MyActor (teacher:Teacher) extends Actor{
private var _teacher:Teacher = _
override def receive: Receive = {
case x:String => _teacher.answerQuestion(x)
case _ => println("你的提问老师不能理解!")
}
override def preStart(): Unit = {//将传进来的参数初始化.
_teacher = teacher
}
override def postStop(): Unit = {
}
}
===============================
package sparkcontext_actor
class Teacher(name:String) {
var _name:String = name
def answerQuestion(question:String): Unit ={
println(_name+"老师回答了问题:" + question)
}
}