架构图
重要类介绍
ActorSystem
在Akka中,ActorSystem是一个重量级的结构,他需要分配多个线程,所以在实际应用中,ActorSystem通常是一个单例对象,我们可以使用这个ActorSystem创建很多Actor。
Actor
在Akka中,Actor负责通信,在Actor中有一些重要的生命周期方法。
1.preStart()方法:该方法在Actor对象构造方法执行后执行,整个Actor生命周期中仅执行一次。
2.receive()方法:该方法在Actor的preStart方法执行完成后执行,用于接收消息,会被反复执行。
代码
4.0.0 cn.itcast.akka MyRPC 1.0 1.7 1.7 UTF-8 2.10.6 2.10 org.scala-lang scala-library ${scala.version} com.typesafe.akka akka-actor_2.10 2.3.14 com.typesafe.akka akka-remote_2.10 2.3.14 src/main/scala src/test/scala net.alchim31.maven scala-maven-plugin 3.2.2 compile testCompile -make:transitive -dependencyfile ${project.build.directory}/.scala_dependencies org.apache.maven.plugins maven-shade-plugin 2.4.3 package shade *:* META-INF/*.SF META-INF/*.DSA META-INF/*.RSA reference.conf cn.itcast.akkk.Master
package cn.itcast.akkaimport akka.actor.{Actor, ActorSystem, Props}import akka.actor.Actor.Receiveimport com.typesafe.config.ConfigFactory/** * Created by ZhaoXing on 2016/8/18. */class Master extends Actor { override def receive: Receive = { case "start" => { println("starting...") println("started") } case "stop" => { println("stopping...") println("stopped") } //Master接收到Worker的消息 case "connect" => { println("a client connected...") //向Worker反馈消息 sender ! "success" } case _ => println("123") }}object Master { def main(args: Array[String]) { val host = "127.0.0.1" val port = 8888 // val host = args(0) // val port = args(1).toInt val confStr = s""" |akka.actor.provider = "akka.remote.RemoteActorRefProvider" |akka.remote.netty.tcp.hostname = "$host" |akka.remote.netty.tcp.port = "$port" """.stripMargin val conf = ConfigFactory.parseString(confStr) //ActorSystem是单例的,用于创建Acotor并监控actor val actorSystem = ActorSystem("MaterActorSystem", conf) //通过ActorSystem创建Actor val master = actorSystem.actorOf(Props[Master], "Master") master ! "start" master ! "hello" master ! "stop" actorSystem.awaitTermination() }}
package cn.itcast.akkaimport akka.actor.{Actor, ActorSystem, Props}import akka.actor.Actor.Receiveimport com.typesafe.config.ConfigFactory/** * Created by ZhaoXing on 2016/8/18. */class Worker extends Actor { //preStart在构造器之后receive之前执行 override def preStart(): Unit = { //首先跟Master建立连接 val master = context.actorSelection("akka.tcp://MaterActorSystem@127.0.0.1:8888/user/Master") //通过mater的引用向Master发送消息 master ! "connect" } override def receive: Receive = { case "success" => { println("a msg for master:success") } }}object Worker { def main(args: Array[String]) { val host = "127.0.0.1" val port = 8889 // val host = args(0) // val port = args(1).toInt val confStr = s""" |akka.actor.provider = "akka.remote.RemoteActorRefProvider" |akka.remote.netty.tcp.hostname = "$host" |akka.remote.netty.tcp.port = "$port" """.stripMargin val conf = ConfigFactory.parseString(confStr) //单例的ActorSystem val actorSystem = ActorSystem("WorkerActorSystem", conf) //通过actorSystem来创建Actor val worker = actorSystem.actorOf(Props[Worker], "Worker") actorSystem.awaitTermination() }}