2017-01-18 1 views
0

Скажите, что у меня есть отправитель электронной почты, который отвечает за отправку писем. Я хочу ограничить # участников, созданных для отправки электронных писем, поэтому я создал маршрутизатор.Как справляться с ошибками, когда один из участников роутера выдает исключение

class EmailSender extends Actor { 

    val router = context.actorOf(RoundRobinRouter(4).props(EmailSender.props)) 

    def recieve = { 
     case SendEmail(emailTo: String, ..) => 
      router ! SendEmailMessage(emailTo,..) 
     case ... 
    } 
} 

Я хочу понять 2 вещи здесь:

  1. Если сообщение электронной почты отправка не удается одним из актеров маршрутизатора, как будет EmailSender получить уведомление и я получить точную электронную почту, что не удалось?
+0

Я думаю, вы забыли спросить 1 вещь :) «Я хочу понять здесь 2 вещи» – pedrorijo91

ответ

1

Если отправка по электронной почте не выполняется в участниках маршрутизации, стратегия надзора по умолчанию заключается в перезапуске актера.

Чтобы вы могли подключиться к методу preRestart и посмотреть, какое сообщение вызвало отказ EmailSender.

class EmailSender extends Actor { 

    def recieve = { 
     case SendEmail(emailTo: String, ..) => 
      router ! SendEmailMessage(emailTo,..) 
     case ... 
    } 
    override def preRestart(reason: Throwable, message: Option[Any]): Unit = { 
     // log the failed message. Or send it back to failedMsg processer 
     if (message.isDefined) { 
     failedEmailsProcessor ! message.get 
     } 
    } 

} 

Примечание: I стратегия надзор AllForOneStrategy тогда preRestart будет называться для всех детей актеров. Так что лучше иметь здесь OneForOneStrategy, так что preRestart вызывается только для неудавшегося актера.

+1

. Я бы рекомендовал отобразить сообщение вместо '.isDefined' +' message.get' – pedrorijo91

+0

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

0

В классе, который содержит маршрутизатор, вы помещаете электронные письма в список ожидающих сообщений электронной почты.

Когда электронное письмо отправлено успешно отправлен EmailSender, оно отправляет обратно сообщение с сообщением об успешности, и класс маршрутизатора удалит его, если из ожидающего списка или сообщения об ошибке, и маршрутизатор может попробовать еще раз в зависимости от вашего бизнеса логика.

+0

Если я не использую постоянство, если я перезапущу сервер, тогда эти сообщения будут потеряны. Так что эта сторона вещей также должна быть рассмотрена. –

+0

Для этого вы можете использовать базу данных. Существует некоторая функция «мертвой буквы», которую вы могли бы использовать для сообщения «Повторить/Сбой», которое вы отправляете обратно. –

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