[英]Omitting all Scala Actor messages except the last
我想省略除最后一個之外的所有相同類型的消息:
def receive = {
case Message(type:MessageType, data:Int) =>
// remove previous and get only last message of passed MessageType
}
例如,當我發送:
actor ! Message(MessageType.RUN, 1)
actor ! Message(MessageType.RUN, 2)
actor ! Message(MessageType.FLY, 1)
那我只想接受:
Message(MessageType.RUN, 2)
Message(MessageType.FLY, 1)
當然,如果它們發送速度非常快,或者CPU負載很高
您可以等待很短的時間,存儲到達的最新消息,然后只處理最近的消息。 這可以通過向您自己和scheduleOnce
發送消息來完成。 請參閱Akka HowTo下的第二個示例:Common Patterns,Scheduling Periodic Messages 。 您可以等到新消息到達時,而不是在最后一個節拍結束時安排節拍。 這是一個類似的例子:
case class ProcessThis(msg: Message)
case object ProcessNow
var onHold = Map.empty[MessageType, Message]
var timer: Option[Cancellable] = None
def receive = {
case msg @ Message(t, _) =>
onHold += t -> msg
if (timer.isEmpty) {
import context.dispatcher
timer = Some(context.system.scheduler.scheduleOnce(1 millis, self, ProcessNow))
}
case ProcessNow =>
timer foreach { _.cancel() }
timer = None
for (m <- onHold.values) self ! ProcessThis(m)
onHold = Map.empty
case ProcessThis(Message(t, data)) =>
// really process the message
}
傳入Message
實際上並未立即處理,而是存儲在僅保留每個MessageType
的最后一個的Map
中。 在ProcessNow
tick消息上,它們確實被處理了。
您可以更改等待的時間長度(在我的示例中設置為1毫秒),以在響應度(從消息到達響應的時間長度)和效率(CPU或其他使用或保留的資源)之間取得平衡。
type
不是字段的好名字,所以讓我們使用messageType
。 這段代碼應該做你想要的:
var lastMessage: Option[Message] = None
def receive = {
case m => {
if (lastMessage.fold(false)(_.messageType != m.messageType)) {
// do something with lastMessage.get
}
lastMessage = Some(m)
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.