How to view akka dead letters

James Davies picture James Davies · May 28, 2014 · Viewed 8.4k times · Source

I've created an Actor that performs some basic operations and appears to be working correctly - however I'm seeing the following show up in my logs regularly

[INFO] [05/28/2014 14:24:00.673] [application-akka.actor.default-dispatcher-5] [akka://application/deadLetters] Message [akka.actor.Status$Failure] from Actor[akka://application/user/trigger_worker_supervisor#-2119432352] to Actor[akka://application/deadLetters] was not delivered. [1] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.

I would like to actually view the contents of the Failure to establish what exactly is throwing a Failure, however I can't quite figure out how to view them.

Reading through the Akka documentation it mentions how to disable the dead-letter warning in the logs, but not how to actually write a handler to process them.

Is there a simple way to actually catch anything sent to dead-letters?

Answer

cmbaxter picture cmbaxter · May 28, 2014

As mentioned in the comment by @wingedsubmariner, you can subscribe to the DeadLetter event on the main system EventStream to be notified when deadletters happen and be able to react to that situation in a more custom manner. In order to subscribe, the code would look like this:

context.system.eventStream.subscribe(myListenerActorRef, classOf[DeadLetter])

Then, the receive for that listener actor could look something like this:

def receive = {
  case DeadLetter(msg, from, to) =>
    //Do my custom stuff here
}

The structure of the DeadLetter class is:

case class DeadLetter(message: Any, sender: ActorRef, recipient: ActorRef)