案例介绍
基于Akka实现在两个进程间发送、接收消息。
- WorkerActor启动后去连接MasterActor,并发送消息给MasterActor.
- MasterActor接收到消息后,再回复消息给WorkerActor
Worker实现
步骤
- 创建一个Maven模块,导入依赖和配置文件.
- 创建Maven模块.
- 把资料下的pom.xml文件中的内容复制到Maven项目akka-worker的pom.xml文件中
- 把资料下的application.conf复制到 src/main/resources文件夹下.
- 打开 application.conf配置文件, 修改端口号为: 9999
- 创建启动WorkerActor.
- 在src/main/scala文件夹下创建包: com.itheima.akka
- 在该包下创建 WorkerActor(单例对象的形式创建).
- 在该包下创建Entrance单例对象, 里边定义main方法
- 发送”setup”消息给WorkerActor,WorkerActor接收打印消息.
- 启动测试.
参考代码
WorkerActor.scala文件中的代码
//1. 创建WorkActor, 用来接收和发送消息.
object WorkerActor extends Actor{
override def receive: Receive = {
//2. 接收消息.
case x => println(x)
}
}
Entrance.scala文件中的代码 ```scala //程序入口. //当前ActorSystem对象的路径 akka.tcp://actorSystem@127.0.0.1:9999 object Entrance { def main(args: Array[String]): Unit = {
//1. 创建ActorSystem.
val actorSystem = ActorSystem("actorSystem", ConfigFactory.load())
//2. 通过ActorSystem, 加载自定义的WorkActor.
val workerActor = actorSystem.actorOf(Props(WorkerActor), "workerActor")
//3. 给WorkActor发送一句话.
workerActor ! "setup"
} }
//启动测试: 右键, 执行, 如果打印结果出现”setup”, 说明程序执行没有问题.
<a name="wTrx4"></a>
# Master实现
**步骤**
1. 创建一个Maven模块,导入依赖和配置文件.
- 创建Maven模块.
- 把资料下的pom.xml文件中的内容复制到Maven项目akka-master的pom.xml文件中
- 把资料下的application.conf复制到 src/main/resources文件夹下.
- 打开 application.conf配置文件, 修改端口号为: 8888
1. 创建启动MasterActor.
- 在src/main/scala文件夹下创建包: com.itheima.akka
- 在该包下创建 MasterActor(单例对象的形式创建).
- 在该包下创建Entrance单例对象, 里边定义main方法
2. WorkerActor发送"connect"消息给MasterActor
2. MasterActor回复"success"消息给WorkerActor
2. WorkerActor接收并打印接收到的消息
2. 启动Master、Worker测试
**参考代码**
- MasterActor.scala文件中的代码
```scala
//MasterActor: 用来接收WorkerActor发送的数据, 并给其返回 回执信息.
//负责管理MasterActor的ActorSystem的地址: akka.tcp://actorSystem@127.0.0.1:8888
object MasterActor extends Actor{
override def receive: Receive = {
//1. 接收WorkerActor发送的数据
case "connect" => {
println("MasterActor接收到: connect!...")
//2. 给WorkerActor回执一句话.
sender ! "success"
}
}
}
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!") } }