-
Notifications
You must be signed in to change notification settings - Fork 3.6k
/
DeadLetterListener.scala
41 lines (32 loc) · 1.44 KB
/
DeadLetterListener.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/**
* Copyright (C) 2009-2018 Lightbend Inc. <https://www.lightbend.com>
*/
package akka.event
import akka.actor.Actor
import akka.actor.DeadLetter
import akka.event.Logging.Info
class DeadLetterListener extends Actor {
val eventStream = context.system.eventStream
val maxCount = context.system.settings.LogDeadLetters
var count = 0
override def preStart(): Unit =
eventStream.subscribe(self, classOf[DeadLetter])
// don't re-subscribe, skip call to preStart
override def postRestart(reason: Throwable): Unit = ()
// don't remove subscription, skip call to postStop, no children to stop
override def preRestart(reason: Throwable, message: Option[Any]): Unit = ()
override def postStop(): Unit =
eventStream.unsubscribe(self)
def receive = {
case DeadLetter(message, snd, rcp) ⇒
count += 1
val origin = if (snd eq context.system.deadLetters) "without sender" else s"from $snd"
val done = maxCount != Int.MaxValue && count >= maxCount
val doneMsg = if (done) ", no more dead letters will be logged" else ""
eventStream.publish(Info(rcp.path.toString, rcp.getClass,
s"Message [${message.getClass.getName}] $origin to $rcp was not delivered. [$count] dead letters encountered$doneMsg. " +
"This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' " +
"and 'akka.log-dead-letters-during-shutdown'."))
if (done) context.stop(self)
}
}