Scala併發編程發送和接收自定義消息

發送和接收自定義消息

我們前面發送的消息是字符串類型,Actor中也支持發送自定義消息,常見的如:使用樣例類封裝消息,然後進行發送處理。

示例一

示例說明

  • 創建一個MsgActor,並向它發送一個同步消息,該消息包含兩個字段(id、message)
  • MsgActor回覆一個消息,該消息包含兩個字段(message、name)
  • 打印回覆消息

[!TIP]

  • 使用!?來發送同步消息
  • 在Actor的act方法中,可以使用sender獲取發送者的Actor引用

參考代碼

  case class Message(id:Int, msg:String)
  case class ReplyMessage(msg:String, name:String)

  object MsgActor extends Actor {
    override def act(): Unit = {
      loop {
        react {
          case Message(id, msg) => {
            println(s"接收到消息:${id}/${msg}")
            sender ! ReplyMessage("不太好", "Tom")
          }
        }
      }
    }
  }

  def main(args: Array[String]): Unit = {
    MsgActor.start()

    val replyMessage: Any = MsgActor !? Message(1, "你好")
    println("回覆消息:" + replyMessage.asInstanceOf[ReplyMessage])
  }

示例二

示例說明

  • 創建一個MsgActor,並向它發送一個異步無返回消息,該消息包含兩個字段(message, company)

[!TIP]

使用!發送異步無返回消息


參考代碼

case class Mesasge(message:String, company:String)

object MsgActor extends Actor {
    override def act(): Unit = {
        loop {
            react {
                case Mesasge(message, company) =>
                println(s"MsgActor接收到消息:${message}/${company}")
            }
        }
    }
}

def main(args: Array[String]): Unit = {
    MsgActor.start()

    MsgActor ! Mesasge("中國聯通", "大爺,快交話費!")
}

示例三

示例說明

  • 創建一個MsgActor,並向它發送一個異步有返回消息,該消息包含兩個字段(id、message)
  • MsgActor回覆一個消息,該消息包含兩個字段(message、name)
  • 打印回覆消息

[!TIP]

  • 使用!!發送異步有返回消息
  • 發送後,返回類型爲Future[Any]的對象
  • Future表示異步返回數據的封裝,雖獲取到Future的返回值,但不一定有值,可能在將來某一時刻纔會返回消息
  • Future的isSet()可檢查是否已經收到返回消息,apply()方法可獲取返回數據

參考代碼

case class Message(id:Int, message:String)
case class ReplyMessage(message:String, name:String)

object MsgActor extends Actor {
    override def act(): Unit = {
        loop {
            react {
                case Message(id, message) =>
                println(s"MsgActor接收到消息:${id}/${message}")
                sender ! ReplyMessage("收到消息!", "JIm")
            }
        }
    }
}

def main(args: Array[String]): Unit = {
    MsgActor.start()

    val future: Future[Any] = MsgActor !! Message(1, "你好!")

    while(!future.isSet) {}

    val replyMessage = future.apply().asInstanceOf[ReplyMessage]
    println(replyMessage)
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章