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"
  }
}

猜你喜欢

转载自blog.csdn.net/weixin_44429965/article/details/107297322