發送和接收自定義消息
我們前面發送的消息是字符串類型,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)
}