簡體   English   中英

Scala Akka演員,消息確認

[英]Scala Akka actor, validation of messages

這是一個體系結構/設計形式的問題,因為我有一個名義上可行的解決方案。 我想看看是否有更好的方法...

我有一個處理許多消息的演員。 每個消息可以具有其自己的內容結構驗證。 我想知道是否有一種合適的模式(幾乎沒有出現)驗證消息。 例如,如果我做了

val f:Future[Any] = actorRef ask MyMessage(invalidContent)

我可以期待回來:

f = Future.failure(ValidationException(someMessage))

目前,我已經通過創建一個繼承了

trait ValidatingActorRef[-T] {

  def actorRef:ActorRef

  def validate:PartialFunction[T, Option[ValidationException]]

  def ask(message:T)(implicit timeout:Timeout):Future[Any] =
    validate
      .lift(message)
      .flatten
      .map(t => Future.failed(t))
      .getOrElse(akka.pattern.ask(actorRef, message))
}

給我

val myActorRefWrapper = new ValidatingActorRef[MyMessages] {  

  val actorRef = system.system.actorOf(Props[MyActor])

  val log = {

    case MyMessage(content) if content == badContent =>
      BadContentValidationException("you have bad content")
  }

}

我在這里得到的是一個驗證響應,而不必浪費時間在actor郵箱上或處理未來。 但是包裝器方法並不是非常好看,我明確地加入了ValidatingActorRef,而不僅僅是ActorRef

有沒有更好的模式?

在我看來,最好不是在發送方,而是在參與者方來驗證消息。

只需使用常規驗證邏輯包裝您的receive方法,然后混合一些驗證實現即可。

同樣來自Ooyala的家伙支票頒贈- http://slideshare.net/EvanChan2/akka-inproductionpnw-scala2013 從第14張幻燈片中查看,並發現它們如何在演員上建立可堆疊的特征

暫無
暫無

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

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