Это вопрос архитектуры/дизайна, поскольку у меня есть номинально работоспособное решение. Я хочу посмотреть, есть ли лучший способ ...Scala Акка актер, проверка сообщений
У меня есть актер, который обрабатывает несколько сообщений. Каждое сообщение может иметь собственную проверку структуры содержимого. Я хочу знать, есть ли подходящий шаблон для (почти бесшумного) подтверждения сообщений. Например, если бы я сделал
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
Есть ли лучший образец?
Не понимаю. Вы говорите об испытании или говорите о чем-то еще? Я чувствую, что ваш вопрос скорее о вашем решении, чем о самой проблеме. –
Я использовал его, чтобы проиллюстрировать то, что я пытаюсь достичь, но я не доволен своим решением. Я думаю о разделении, в первую очередь для тестирования, а также контекста и повторного использования. Например, я мог бы использовать одного и того же актера для обработки записи документа на диск, но различные проверки подлинности для проверки содержимого документа. –
«Использовать одного и того же актера», я имею в виду ту же реализацию, но не то же самое ref –