diff --git a/akka-actor/src/main/scala/akka/actor/ActorSystem.scala b/akka-actor/src/main/scala/akka/actor/ActorSystem.scala index 62e20863d4..211ab221e6 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorSystem.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorSystem.scala @@ -938,6 +938,9 @@ private[akka] class ActorSystemImpl( } } + // eager initialization of CoordinatedShutdown + CoordinatedShutdown(this) + loadExtensions("akka.library-extensions", throwOnLoadFail = true) loadExtensions("akka.extensions", throwOnLoadFail = false) } diff --git a/akka-actor/src/main/scala/akka/actor/CoordinatedShutdown.scala b/akka-actor/src/main/scala/akka/actor/CoordinatedShutdown.scala index fcb30d7f25..472537317d 100644 --- a/akka-actor/src/main/scala/akka/actor/CoordinatedShutdown.scala +++ b/akka-actor/src/main/scala/akka/actor/CoordinatedShutdown.scala @@ -373,7 +373,7 @@ final class CoordinatedShutdown private[akka] ( /** * Scala API: Add a JVM shutdown hook that will be run when the JVM process - * begins its shutdown sequence. Added hooks may run in an order + * begins its shutdown sequence. Added hooks may run in any order * concurrently, but they are running before Akka internal shutdown * hooks, e.g. those shutting down Artery. */ @@ -382,11 +382,16 @@ final class CoordinatedShutdown private[akka] ( val currentLatch = _jvmHooksLatch.get val newLatch = new CountDownLatch(currentLatch.getCount.toInt + 1) if (_jvmHooksLatch.compareAndSet(currentLatch, newLatch)) { - Runtime.getRuntime.addShutdownHook(new Thread { + try Runtime.getRuntime.addShutdownHook(new Thread { override def run(): Unit = { try hook() finally _jvmHooksLatch.get.countDown() } - }) + }) catch { + case e: IllegalStateException ⇒ + // Shutdown in progress, if CoordinatedShutdown is created via a JVM shutdown hook (Artery) + log.warning("Could not addJvmShutdownHook, due to: {}", e.getMessage) + _jvmHooksLatch.get.countDown() + } } else addJvmShutdownHook(hook) // lost CAS, retry } diff --git a/akka-multi-node-testkit/src/main/scala/akka/remote/testkit/MultiNodeSpec.scala b/akka-multi-node-testkit/src/main/scala/akka/remote/testkit/MultiNodeSpec.scala index fa9b723c3f..d4607b07b9 100644 --- a/akka-multi-node-testkit/src/main/scala/akka/remote/testkit/MultiNodeSpec.scala +++ b/akka-multi-node-testkit/src/main/scala/akka/remote/testkit/MultiNodeSpec.scala @@ -214,6 +214,7 @@ object MultiNodeSpec { loggers = ["akka.testkit.TestEventListener"] loglevel = "WARNING" stdout-loglevel = "WARNING" + coordinated-shutdown.run-by-jvm-shutdown-hook = off actor { default-dispatcher { executor = "fork-join-executor" diff --git a/akka-remote/src/main/scala/akka/remote/artery/ArteryTransport.scala b/akka-remote/src/main/scala/akka/remote/artery/ArteryTransport.scala index 48e26b3e3f..45d2c13093 100644 --- a/akka-remote/src/main/scala/akka/remote/artery/ArteryTransport.scala +++ b/akka-remote/src/main/scala/akka/remote/artery/ArteryTransport.scala @@ -324,7 +324,6 @@ private[remote] class ArteryTransport(_system: ExtendedActorSystem, _provider: R */ private[this] val _inboundCompressions = { if (settings.Advanced.Compression.Enabled) { - println(s"settings.Advanced.Compression.Enabled = ${settings.Advanced.Compression.Enabled}") val eventSink = createFlightRecorderEventSink(synchr = false) new InboundCompressionsImpl(system, this, settings.Advanced.Compression, eventSink) } else NoInboundCompressions