案例介绍

基于Akka实现在两个进程间发送、接收消息。

  1. WorkerActor启动后去连接MasterActor,并发送消息给MasterActor.
  2. MasterActor接收到消息后,再回复消息给WorkerActor

image.png

Worker实现

步骤

  1. 创建一个Maven模块,导入依赖和配置文件.
    • 创建Maven模块.
    • 把资料下的pom.xml文件中的内容复制到Maven项目akka-worker的pom.xml文件中
    • 把资料下的application.conf复制到 src/main/resources文件夹下.
    • 打开 application.conf配置文件, 修改端口号为: 9999
  2. 创建启动WorkerActor.
    • 在src/main/scala文件夹下创建包: com.itheima.akka
    • 在该包下创建 WorkerActor(单例对象的形式创建).
    • 在该包下创建Entrance单例对象, 里边定义main方法
  3. 发送”setup”消息给WorkerActor,WorkerActor接收打印消息.
  4. 启动测试.

参考代码

  • WorkerActor.scala文件中的代码

    1. //1. 创建WorkActor, 用来接收和发送消息.
    2. object WorkerActor extends Actor{
    3. override def receive: Receive = {
    4. //2. 接收消息.
    5. case x => println(x)
    6. }
    7. }
  • Entrance.scala文件中的代码 ```scala //程序入口. //当前ActorSystem对象的路径 akka.tcp://actorSystem@127.0.0.1:9999 object Entrance { def main(args: Array[String]): Unit = {

    1. //1. 创建ActorSystem.
    2. val actorSystem = ActorSystem("actorSystem", ConfigFactory.load())
    3. //2. 通过ActorSystem, 加载自定义的WorkActor.
    4. val workerActor = actorSystem.actorOf(Props(WorkerActor), "workerActor")
    5. //3. 给WorkActor发送一句话.
    6. workerActor ! "setup"

    } }

//启动测试: 右键, 执行, 如果打印结果出现”setup”, 说明程序执行没有问题.

  1. <a name="wTrx4"></a>
  2. # Master实现
  3. **步骤**
  4. 1. 创建一个Maven模块,导入依赖和配置文件.
  5. - 创建Maven模块.
  6. - 把资料下的pom.xml文件中的内容复制到Maven项目akka-master的pom.xml文件中
  7. - 把资料下的application.conf复制到 src/main/resources文件夹下.
  8. - 打开 application.conf配置文件, 修改端口号为: 8888
  9. 1. 创建启动MasterActor.
  10. - 在src/main/scala文件夹下创建包: com.itheima.akka
  11. - 在该包下创建 MasterActor(单例对象的形式创建).
  12. - 在该包下创建Entrance单例对象, 里边定义main方法
  13. 2. WorkerActor发送"connect"消息给MasterActor
  14. 2. MasterActor回复"success"消息给WorkerActor
  15. 2. WorkerActor接收并打印接收到的消息
  16. 2. 启动Master、Worker测试
  17. **参考代码**
  18. - MasterActor.scala文件中的代码
  19. ```scala
  20. //MasterActor: 用来接收WorkerActor发送的数据, 并给其返回 回执信息.
  21. //负责管理MasterActor的ActorSystem的地址: akka.tcp://actorSystem@127.0.0.1:8888
  22. object MasterActor extends Actor{
  23. override def receive: Receive = {
  24. //1. 接收WorkerActor发送的数据
  25. case "connect" => {
  26. println("MasterActor接收到: connect!...")
  27. //2. 给WorkerActor回执一句话.
  28. sender ! "success"
  29. }
  30. }
  31. }
  • Entrance.scala文件中的代码

    //Master模块的主入口
    object Entrance {
    def main(args: Array[String]): Unit = {
      //1. 创建ActorSystem, 用来管理用户所有的自定义Actor.
      val actorSystem = ActorSystem("actorSystem", ConfigFactory.load())
      //2. 关联ActorSystem和MasterActor.
      val masterActor = actorSystem.actorOf(Props(MasterActor), "masterActor")
      //3. 给masterActor发送一句话: 测试数据, 用来测试.
      //masterActor ! "测试数据"
    }
    }
    
  • WorkerActor.scala文件中的代码(就修改了第3步)

    //WorkerActor: 用来接收ActorSystem发送的消息, 并发送消息给MasterActor, 然后接收MasterActor的回执信息.
    //负责管理WorkerActor的ActorSystem的地址:  akka.tcp://actorSystem@127.0.0.1:9999
    object WorkerActor extends Actor{
    override def receive: Receive = {
      //1. 接收Entrance发送过来的: setup.
      case "setup" => {
        println("WorkerActor接收到: Entrance发送过来的指令 setup!.")
    
        //2. 获取MasterActor的引用.
        val masterActor = context.system.actorSelection("akka.tcp://actorSystem@127.0.0.1:8888/user/masterActor")
    
        //3. 给MasterActor发送一句话.
        masterActor ! "connect"
      }
    
        //4. 接收MasterActor的回执信息.
      case "success" => println("WorkerActor接收到: success!")
    }
    }