簡體   English   中英

省略除最后一個之外的所有Scala Actor消息

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM