简单易懂的Actor通讯系统栗子

使用

依赖

compile group: 'com.typesafe.akka', name: 'akka-actor_2.12', version: '2.5.21'
compile group: 'com.typesafe.akka', name: 'akka-remote_2.12', version: '2.5.21'

定义消息协议

object Messages {

  case class Hello(content: String)
  case class World(content: String)

}

定义常量

object Cons {

  val ResourceManagerName = "ResourceManagerName"
  val NodeManagerName = "NodeManagerName"
  val ResourceActor = "ResourceActor"
  val NodeActor = "NodeActor"

}

服务器

import akka.actor._
import com.typesafe.config.{Config, ConfigFactory}

class MyResourceManager() extends Actor {
  override def receive: Receive = {
    case Messages.Hello(content: String) => {

      sender() ! Messages.World("服务器回调")
    }
  }
}

object MyResourceManagerMain {
  def main(args: Array[String]): Unit = {
    val str: String =
      """
        |akka.actor.provider = "akka.remote.RemoteActorRefProvider"
        |akka.actor.warn-about-java-serializer-usage = off
        |akka.remote.netty.tcp.hostname = localhost
        |akka.remote.netty.tcp.port = 20000
      """.stripMargin
    val conf: Config = ConfigFactory.parseString(str)
    val actorSystem = ActorSystem(Cons.ResourceManagerName, conf)
    actorSystem.actorOf(Props(new MyResourceManager()), Cons.ResourceActor)
  }
}

节点

import akka.actor.{Actor, ActorSelection, ActorSystem, Props}
import com.typesafe.config.{Config, ConfigFactory}

class MyNodeManager(resourceHost: String = "localhost", resourcePort: Int = 20000) extends Actor {

  var resourceManager: ActorSelection = _

  override def preStart(): Unit = {
    resourceManager = context.actorSelection(s"akka.tcp://${Cons.ResourceManagerName}@$resourceHost:$resourcePort/user/${Cons.ResourceActor}")

    resourceManager ! Messages.Hello("haha")
  }

  override def receive: Receive = {
    case Messages.World(content: String) => {
      println(content)
    }
  }
}

object MyNodeManagerMain {
  def main(args: Array[String]): Unit = {
    val str: String =
      """
        |akka.actor.provider = "akka.remote.RemoteActorRefProvider"
        |akka.actor.warn-about-java-serializer-usage = off
        |akka.remote.netty.tcp.hostname = localhost
        |akka.remote.netty.tcp.port = 20001
      """.stripMargin
    val conf: Config = ConfigFactory.parseString(str)
    val actorSystem = ActorSystem(Cons.NodeManagerName, conf)
    actorSystem.actorOf(Props(new MyNodeManager()), Cons.NodeActor)
  }
}
  1. 启动 MyResourceManager
  2. 启动 MyNodeManager
[INFO] [02/21/2019 01:13:02.734] [main] [akka.remote.Remoting] Starting remoting
[INFO] [02/21/2019 01:13:02.878] [main] [akka.remote.Remoting] Remoting started; listening on addresses :[akka.tcp://NodeManagerName@localhost:20001]
[INFO] [02/21/2019 01:13:02.879] [main] [akka.remote.Remoting] Remoting now listens on addresses: [akka.tcp://NodeManagerName@localhost:20001]
服务器回调

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • [cp]人非全知全能,所以一定会犯错,会遇到挫折,会不够好。 我妈非常脆弱,我向她传递负面情绪,她往往会大崩溃。记...
    liliqdsd阅读 275评论 0 0
  • 到处都是这种鸡汤文,读书就如何如何,不读书就一定一无是处。觉得好搞笑,因为到底什么是读书呢?在校学习?看纸质书?看...
    随性自由过生活阅读 208评论 0 0
  • 移动应用界面设计趋势根据用户需求不断变化。然而,这并不意味着2018的移动应用UI设计趋势是无法预测的。事实上,经...
    李子里阅读 914评论 0 3
  • 背景 最近研究网关,逛了一大圈,由于部门的主打语言是golang和py所有尽量找golang圈的,但是go圈的网关...
    scriptllh阅读 459评论 0 0
  • 进入培训第二天,店长让我们每个人都想个英文名,然后对我们说以后出去吃饭,上厕所,倒垃圾都要说英文,当时我还笑...
    镇江吾悦DDM施静静阅读 317评论 2 0

友情链接更多精彩内容