diff --git a/akka-actor/src/main/scala/akka/actor/ActorRef.scala b/akka-actor/src/main/scala/akka/actor/ActorRef.scala index a9a04c241d..d67952b62e 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRef.scala @@ -849,7 +849,9 @@ private[akka] class VirtualPathContainer( */ @InternalApi private[akka] object FunctionRef { def deadLetterMessageHandler(system: ActorSystem): (ActorRef, Any) => Unit = { (sender, msg) => - system.deadLetters.tell(msg, sender) + // avoid infinite loop (StackOverflow) if FunctionRef is used for subscribing to DeadLetter from eventStream + if (!msg.isInstanceOf[DeadLetter]) + system.deadLetters.tell(msg, sender) } } @@ -971,11 +973,11 @@ private[akka] class VirtualPathContainer( } override def stop(): Unit = { - sendTerminated() // The messageHandler function may close over a large object graph (such as an Akka Stream) // so we replace the messageHandler function to make that available for garbage collection. // Doesn't matter if the change isn't visible immediately, volatile not needed. messageHandler = FunctionRef.deadLetterMessageHandler(system) + sendTerminated() } private def addWatcher(watchee: ActorRef, watcher: ActorRef): Unit = {