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