发送和接收自定义消息

  1. 使用!?来发送同步消息,使用!发送异步无返回消息

  2. 使用!!发送异步有返回消息
    发送后,返回类型为Future[Any]的对象
    Future表示异步返回数据的封装,虽获取到Future的返回值,但不一定有值,可能在将来某一时刻才会返回消息
    Future的isSet()可检查是否已经收到返回消息,apply()方法可获取返回数据

  3. 在Actor的act方法中,可以使用sender获取发送者的Actor引用

    使用!?来发送同步消息

    ```scala import scala.actors.Actor

object Test05 {

//定义一个信息类 包含两个字段(id、message) case class Message(id: Int, msg: String)

//定义一个信息回复类, 包含两个字段(message、name) case class RelyMessage(msg: String, name: String)

//创建一个MsgActor,并向它发送一个同步消息 object MsgActor extends Actor { override def act(): Unit = { //持续接收信息 loop { react { case Message(id,msg) => { println(s”接收到的信息 : ${id}/${msg}”) //使用!发送异步无返回消息 sender ! RelyMessage(“不太好”,”Tom”) } } } } }

def main(args: Array[String]): Unit = { //启动 MsgActor.start() //发送发送同步消息 有返回值 val replyMessage:Any = MsgActor !? Message(1,”您好”) //接收到的回复信息 val msg = replyMessage.asInstanceOf[RelyMessage] println(“回复消息:” + msg) } }

  1. ![image.png](https://cdn.nlark.com/yuque/0/2022/png/520075/1649897783164-3b9578e3-100d-44f8-aa0e-1e08304c4134.png#clientId=u7a7cf3ef-fb81-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=51&id=u11183513&margin=%5Bobject%20Object%5D&name=image.png&originHeight=59&originWidth=336&originalType=binary&ratio=1&rotation=0&showTitle=false&size=27195&status=done&style=none&taskId=ub5dd9fc4-8c6c-41e8-9473-57613c4ab49&title=&width=288)
  2. <a name="VWS7u"></a>
  3. ## 使用!发送异步无返回消息
  4. ```scala
  5. package com.czxy.demo05
  6. import scala.actors.Actor
  7. object Test06 {
  8. // 定义一个消息类
  9. // 包含两个字段(message, company)
  10. case class Message(message: String, company: String)
  11. //创建一个MsgActor,并向它发送一个异步无返回消息
  12. object MsgActor extends Actor {
  13. override def act(): Unit = {
  14. loop {
  15. react {
  16. case Message(message, company) => println(s"MsgActor接收到消息${message}/${company}")
  17. }
  18. }
  19. }
  20. }
  21. def main(args: Array[String]): Unit = {
  22. //启动
  23. MsgActor.start()
  24. //发送异步无返回信息
  25. MsgActor ! Message("中国联通", "要交话费了")
  26. }
  27. }

image.png

使用!!发送异步有返回消息

image.png

  1. import scala.actors.{Actor, Future}
  2. object Test12 {
  3. // MsgActor回复一个消息,该消息包含两个字段(message、name)
  4. // 打印回复消息
  5. //定义一个信息类 包含两个字段(id、message)
  6. case class Message(id: Int, msg: String)
  7. //定义一个信息回复类, 包含两个字段(message、name)
  8. case class RelyMessage(msg: String, name: String)
  9. //创建一个MsgActor,并向它发送一个异步有返回消息
  10. object MsgActor extends Actor {
  11. override def act(): Unit = {
  12. //持续接收信息
  13. loop {
  14. react {
  15. case Message(id,msg) => {
  16. println(s"接收到的信息 : ${id}/${msg}")
  17. //使用!发送异步无返回消息
  18. sender ! RelyMessage("收到消息","JIM")
  19. }
  20. }
  21. }
  22. }
  23. }
  24. def main(args: Array[String]): Unit = {
  25. //启动
  26. MsgActor.start()
  27. val future: Future[Any] = MsgActor !! Message(1,"您好")
  28. //检查是否收到信息
  29. while (!future.isSet){
  30. //收到信息
  31. val relyMessage = future.apply().asInstanceOf[RelyMessage]
  32. //打印回复信息
  33. println(s"relyMessage = ${relyMessage}")
  34. }
  35. }
  36. }