diff --git a/akka-actor-tests/src/test/scala/akka/config/ConfigSpec.scala b/akka-actor-tests/src/test/scala/akka/config/ConfigSpec.scala index d633d942e5..521e8d4d4a 100644 --- a/akka-actor-tests/src/test/scala/akka/config/ConfigSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/config/ConfigSpec.scala @@ -36,9 +36,18 @@ class ConfigSpec extends AkkaSpec(ConfigFactory.defaultReference) { getMilliseconds("akka.actor.default-dispatcher.shutdown-timeout") must equal(1 * 1000) getInt("akka.actor.default-dispatcher.throughput") must equal(5) getMilliseconds("akka.actor.default-dispatcher.throughput-deadline-time") must equal(0) + getBoolean("akka.actor.serialize-messages") must equal(false) settings.SerializeAllMessages must equal(false) + getInt("akka.scheduler.ticksPerWheel") must equal(512) + settings.SchedulerTicksPerWheel must equal(512) + + getMilliseconds("akka.scheduler.tickDuration") must equal(100) + settings.SchedulerTickDuration must equal(100 millis) + + getBoolean("akka.scheduler.daemonic") must equal(true) + settings.SchedulerDaemonicity must equal(true) } } } diff --git a/akka-actor/src/main/resources/reference.conf b/akka-actor/src/main/resources/reference.conf index 463c3121fe..e90e4f41bf 100644 --- a/akka-actor/src/main/resources/reference.conf +++ b/akka-actor/src/main/resources/reference.conf @@ -271,5 +271,6 @@ akka { # For more information see: http://www.jboss.org/netty/ tickDuration = 100ms ticksPerWheel = 512 + daemonic = on } } diff --git a/akka-actor/src/main/scala/akka/actor/ActorSystem.scala b/akka-actor/src/main/scala/akka/actor/ActorSystem.scala index 07ed860116..0a646709bc 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorSystem.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorSystem.scala @@ -96,6 +96,7 @@ object ActorSystem { final val SchedulerTickDuration = Duration(getMilliseconds("akka.scheduler.tickDuration"), MILLISECONDS) final val SchedulerTicksPerWheel = getInt("akka.scheduler.ticksPerWheel") + final val SchedulerDaemonicity = getBoolean("akka.scheduler.daemonic") if (ConfigVersion != Version) throw new ConfigurationException("Akka JAR version [" + Version + "] does not match the provided config version [" + ConfigVersion + "]") @@ -408,18 +409,18 @@ class ActorSystemImpl(val name: String, applicationConfig: Config) extends Actor * executed upon close(), the task may execute before its timeout. */ protected def createScheduler(): Scheduler = { - val threadFactory = new MonitorableThreadFactory("DefaultScheduler") - val hwt = new HashedWheelTimer(log, threadFactory, settings.SchedulerTickDuration, settings.SchedulerTicksPerWheel) + val hwt = new HashedWheelTimer(log, + new MonitorableThreadFactory("DefaultScheduler", settings.SchedulerDaemonicity), + settings.SchedulerTickDuration, + settings.SchedulerTicksPerWheel) // note that dispatcher is by-name parameter in DefaultScheduler constructor, // because dispatcher is not initialized when the scheduler is created - def safeDispatcher = { - if (dispatcher eq null) { + def safeDispatcher = dispatcher match { + case null ⇒ val exc = new IllegalStateException("Scheduler is using dispatcher before it has been initialized") log.error(exc, exc.getMessage) throw exc - } else { - dispatcher - } + case dispatcher ⇒ dispatcher } new DefaultScheduler(hwt, log, safeDispatcher) } diff --git a/akka-actor/src/main/scala/akka/actor/Scheduler.scala b/akka-actor/src/main/scala/akka/actor/Scheduler.scala index 4fc9bf681b..e89523b6bb 100644 --- a/akka-actor/src/main/scala/akka/actor/Scheduler.scala +++ b/akka-actor/src/main/scala/akka/actor/Scheduler.scala @@ -123,7 +123,9 @@ trait Cancellable { * if it does not enqueue a task. Once a task is queued, it MUST be executed or * returned from stop(). */ -class DefaultScheduler(hashedWheelTimer: HashedWheelTimer, log: LoggingAdapter, dispatcher: ⇒ MessageDispatcher) extends Scheduler with Closeable { +class DefaultScheduler(hashedWheelTimer: HashedWheelTimer, + log: LoggingAdapter, + dispatcher: ⇒ MessageDispatcher) extends Scheduler with Closeable { def schedule(initialDelay: Duration, delay: Duration, receiver: ActorRef, message: Any): Cancellable = { val continuousCancellable = new ContinuousCancellable