Scala利用akka实现maste、worker通信
创建Master
import akka.actor.{Actor, ActorSystem, Props}
import com.typesafe.config.ConfigFactory
class master extends Actor {
println("master启动了")
//todo 初始化方法,在构造方法之后执行一次
override def preStart(): Unit = {
}
//todo receive方法用于消息的接受处理
override def receive = {
case "connect" => {println("是谁~在敲打我窗")
sender ! "successed"}
}
}
object master {
def main(args: Array[String]): Unit = {
// akka.actor.provider = "akka.remote.RemoteActorRefProvider"
// akka.remote.netty.tcp.hostname = "$host"
// akka.remote.netty.tcp.port = "$port"
//todo 利用参数获取配置,增加代码灵活性
val host = args(0)
val port = args(1)
val configStr =
s"""
|akka.actor.provider = "akka.remote.RemoteActorRefProvider"
| akka.remote.netty.tcp.hostname = "$host"
| akka.remote.netty.tcp.port = "$port"
""".stripMargin
//todo 准备配置文件
val config = ConfigFactory.parseString(configStr)
//todo 创建ActorSystem,用于管理众多的actor
val masterActorSystem = ActorSystem.create("masterActorSystem", config)
//todo 通过masterActorSystem创建masterActor
val master = masterActorSystem.actorOf(Props(new master), "masterActor")
//
// master ! "connect"
}
}
创建Worker:需要通过context.actorSelection拿到master引用
import akka.actor.{Actor, ActorSelection, ActorSystem, Props}
import com.typesafe.config.ConfigFactory
class worker extends Actor {
override def preStart(): Unit = {
//todo 在初始化中拿到master引用(协议、host、port、actorSystem、masterActor、actor层级)
//todo 这里是master的IP和端口
val master: ActorSelection = context.actorSelection("akka.tcp://[email protected]:12123/user/masterActor")
//todo 发送注册信息
master ! "connect"
}
override def receive = {
//todo 接收master返回的消息
case "successed" => println("伞兵一号卢本伟闪亮登场")
}
}
object worker {
def main(args: Array[String]): Unit = {
val host = args(0)
val port = args(1)
//todo 解析字符串配置
val config = ConfigFactory.parseString(
s"""akka.actor.provider = "akka.remote.RemoteActorRefProvider"
|akka.remote.netty.tcp.hostname = "$host"
|akka.remote.netty.tcp.port = "$port"""".stripMargin)
//todo 获取workerActorSystem
val workerActorSystem = ActorSystem.create("workerActorSystem", config)
//todo 创建workerActor
val worker = workerActorSystem.actorOf(Props(new worker), "workerActor")
//
// worker ! "ask"
}
}