cool breeze
cool breeze

Reputation: 4811

How to handle failures when one of the router actors throws an exception

Say I have an email sender actor that is responsible for sending out emails. I want to limit the # of actors created for sending emails, so I created a router.

class EmailSender extends Actor {

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

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

I want to understand 2 things here:

  1. If an email message sending fails by one of the router actors, how will EmailSender get notified and will I get the exact email that failed?

Upvotes: 0

Views: 82

Answers (2)

Vishal John
Vishal John

Reputation: 4382

If the email sending fails within the Routee actors, the default supervision strategy is to restart the actor.

So you should be able to hook into the preRestart method and see which message caused the EmailSender to fail.

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
       }
    }

 }

Note: I the supervision strategy is AllForOneStrategy then preRestart would be called for all the child actors. So it's better to have OneForOneStrategy here, so that preRestart is called only for the failed actor.

Upvotes: 1

Sami Badawi
Sami Badawi

Reputation: 1032

In the class that contains the router you put the emails into a list pending email.

When a email has been sent out successfully to EmailSender, it sends back an message saying success and the router class will remove it if from the pending list or a failure message and the router can try one more time depending you your business logic.

Upvotes: 0

Related Questions