这是一个架构/设计形式的问题,因为我有一个名义上可行的解决方案。我想看看有没有更好的方法...
我有一个处理许多消息的演员。每条消息都可能有自己的内容结构验证。我想知道是否有适合(几乎无缝的)消息验证的模式。例如,如果我做了
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")
}
}
我在这里得到的是一个验证响应,而不必在演员邮箱上浪费时间,或者处理未来。然而,包装方法不是很完美,我已经明确地连接了一个 ValidatingActorRef,而不仅仅是一个 ActorRef
有更好的模式吗?