2013-11-13 3 views
0

Это вопрос архитектуры/дизайна, поскольку у меня есть номинально работоспособное решение. Я хочу посмотреть, есть ли лучший способ ...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

Есть ли лучший образец?

+0

Не понимаю. Вы говорите об испытании или говорите о чем-то еще? Я чувствую, что ваш вопрос скорее о вашем решении, чем о самой проблеме. –

+0

Я использовал его, чтобы проиллюстрировать то, что я пытаюсь достичь, но я не доволен своим решением. Я думаю о разделении, в первую очередь для тестирования, а также контекста и повторного использования. Например, я мог бы использовать одного и того же актера для обработки записи документа на диск, но различные проверки подлинности для проверки содержимого документа. –

+0

«Использовать одного и того же актера», я имею в виду ту же реализацию, но не то же самое ref –

ответ

1

На мой взгляд, лучше проверить сообщение не на стороне отправителя, а на стороне участников.

Просто оберните свой метод receive с общей логикой проверки и смешайте некоторую реализацию проверки.

Также проверьте презентацию от ooyala guys - http://slideshare.net/EvanChan2/akka-inproductionpnw-scala2013. Посмотрите с 14-го слайда и найдите, как они строят штабелируемые черты на актеров

+0

Хм, я нахожу, что у меня есть три компонента обработки сообщений, проверки, регистрации и обработки. Теоретически я мог бы абстрагировать все три реализации и объединить их в обобщенный шаблон актера, хотя обработчик должен будет иметь ссылку на отправителя. –

+0

. Вы можете проверить презентацию от ребята ooyala - http://www.slideshare.net/EvanChan2/Акка-inproductionpnw-scala2013. Посмотрите с 14-го слайда и найдите, как они создают увлекательные черты на актеров. Я обновил свой ответ – 1esha

Смежные вопросы