簡體   English   中英

Actor消息的同步

[英]Synchronization of Actor messages

如何處理要按特定順序執行和完成的角色之間的消息?

換句話說,例如,如果Message A要被前總是收到Message B ,用阿卡它可以怎么做?

我在這里假設您的意思是您需要先獲得“消息A”,然后才能處理“消息B”。 其他替代方法是:

  • 如果隊列同時包含兩個消息,則希望在“消息B”之前接收任何“消息A”。
  • 如果要按“消息B”的順序發送“消息A”,則希望在該消息之前對其進行處理-這是它已經從同一發件人發送的方式,如果發件人不同,則不能執行此操作。

因此,放棄了這些其他選項之后,這是一種技術。 首先,為需要消息A和消息B的狀態定義單獨的接收方法:

def receivingA = Receive {
  case MessageA(x) => ...
}

def receivingB = Receive {
  case MessageB(y) => ...
}

您可以將第一個設置為默認值:

def receive = receivingA

收到消息A時,可以更改狀態以期望消息B:

case MessageA(x) =>
  // do stuff
  become(receivingB)

在消息B上,您可以返回第一種情況,但是我將跳過。

現在唯一缺少的是您將如何處理意外收到的消息。 您什么也不能做,這會將它們發送到錯誤日志,或者可以通過重寫此方法來做一些事情:

def unhandled(msg: Any): Unit = message match {
  case Terminated(target) => ...
  case msg => ...
}

默認行為將未處理的消息作為UnhandledMessage類型的對象發布到系統事件流,因此您也可以通過這種方式獲取它們,盡管這只會將它們重新插入其他類型的隊列中。 最后,您可能會亂序接收消息B並將其排隊,然后在收到消息A后重新發送它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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