diff --git a/akka-actor/src/main/scala/akka/actor/ActorDSL.scala b/akka-actor/src/main/scala/akka/actor/ActorDSL.scala index 1110b642de..1e8a6f003f 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorDSL.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorDSL.scala @@ -88,7 +88,7 @@ object ActorDSL extends dsl.Inbox with dsl.Creators { protected class Extension(val system: ExtendedActorSystem) extends akka.actor.Extension with InboxExtension { - val boss = system.asInstanceOf[ActorSystemImpl].systemActorOf(Props( + val boss = system.systemActorOf(Props( new Actor { def receive = { case any ⇒ sender() ! any } }), "dsl").asInstanceOf[RepointableActorRef] diff --git a/akka-actor/src/main/scala/akka/actor/ActorSystem.scala b/akka-actor/src/main/scala/akka/actor/ActorSystem.scala index 170aced5c3..79654fa978 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorSystem.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorSystem.scala @@ -463,6 +463,12 @@ abstract class ExtendedActorSystem extends ActorSystem { */ def systemGuardian: InternalActorRef + /** + * Create an actor in the "/system" namespace. This actor will be shut down + * during system shutdown only after all user actors have terminated. + */ + def systemActorOf(props: Props, name: String): ActorRef + /** * A ThreadFactory that can be used if the transport needs to create any Threads */ @@ -541,7 +547,7 @@ private[akka] class ActorSystemImpl(val name: String, applicationConfig: Config, protected def systemImpl: ActorSystemImpl = this - private[akka] def systemActorOf(props: Props, name: String): ActorRef = systemGuardian.underlying.attachChild(props, name, systemService = true) + def systemActorOf(props: Props, name: String): ActorRef = systemGuardian.underlying.attachChild(props, name, systemService = true) def actorOf(props: Props, name: String): ActorRef = guardian.underlying.attachChild(props, name, systemService = false) diff --git a/akka-actor/src/main/scala/akka/io/Tcp.scala b/akka-actor/src/main/scala/akka/io/Tcp.scala index 02e668ba2a..bb7c4bfc80 100644 --- a/akka-actor/src/main/scala/akka/io/Tcp.scala +++ b/akka-actor/src/main/scala/akka/io/Tcp.scala @@ -556,7 +556,7 @@ class TcpExt(system: ExtendedActorSystem) extends IO.Extension { * */ val manager: ActorRef = { - system.asInstanceOf[ActorSystemImpl].systemActorOf( + system.systemActorOf( props = Props(classOf[TcpManager], this).withDispatcher(Settings.ManagementDispatcher).withDeploy(Deploy.local), name = "IO-TCP") } diff --git a/akka-actor/src/main/scala/akka/io/Udp.scala b/akka-actor/src/main/scala/akka/io/Udp.scala index 3d0d364e20..c80e162e0c 100644 --- a/akka-actor/src/main/scala/akka/io/Udp.scala +++ b/akka-actor/src/main/scala/akka/io/Udp.scala @@ -212,7 +212,7 @@ class UdpExt(system: ExtendedActorSystem) extends IO.Extension { val settings: UdpSettings = new UdpSettings(system.settings.config.getConfig("akka.io.udp")) val manager: ActorRef = { - system.asInstanceOf[ActorSystemImpl].systemActorOf( + system.systemActorOf( props = Props(classOf[UdpManager], this).withDeploy(Deploy.local), name = "IO-UDP-FF") } diff --git a/akka-actor/src/main/scala/akka/io/UdpConnected.scala b/akka-actor/src/main/scala/akka/io/UdpConnected.scala index fd24d861c4..8260ac1ad0 100644 --- a/akka-actor/src/main/scala/akka/io/UdpConnected.scala +++ b/akka-actor/src/main/scala/akka/io/UdpConnected.scala @@ -149,7 +149,7 @@ class UdpConnectedExt(system: ExtendedActorSystem) extends IO.Extension { val settings: UdpSettings = new UdpSettings(system.settings.config.getConfig("akka.io.udp-connected")) val manager: ActorRef = { - system.asInstanceOf[ActorSystemImpl].systemActorOf( + system.systemActorOf( props = Props(classOf[UdpConnectedManager], this).withDeploy(Deploy.local), name = "IO-UDP-CONN") } diff --git a/akka-cluster/src/main/scala/akka/cluster/Cluster.scala b/akka-cluster/src/main/scala/akka/cluster/Cluster.scala index dd7ace7b7f..1467df7e92 100644 --- a/akka-cluster/src/main/scala/akka/cluster/Cluster.scala +++ b/akka-cluster/src/main/scala/akka/cluster/Cluster.scala @@ -157,7 +157,7 @@ class Cluster(val system: ExtendedActorSystem) extends Extension { // create supervisor for daemons under path "/system/cluster" private val clusterDaemons: ActorRef = { - system.asInstanceOf[ActorSystemImpl].systemActorOf(Props(classOf[ClusterDaemon], settings). + system.systemActorOf(Props(classOf[ClusterDaemon], settings). withDispatcher(UseDispatcher).withDeploy(Deploy.local), name = "cluster") } diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterReadView.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterReadView.scala index 087927f7b5..63220422ff 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterReadView.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterReadView.scala @@ -45,7 +45,7 @@ private[akka] class ClusterReadView(cluster: Cluster) extends Closeable { // create actor that subscribes to the cluster eventBus to update current read view state private val eventBusListener: ActorRef = { - cluster.system.asInstanceOf[ActorSystemImpl].systemActorOf(Props(new Actor with RequiresMessageQueue[UnboundedMessageQueueSemantics] { + cluster.system.systemActorOf(Props(new Actor with RequiresMessageQueue[UnboundedMessageQueueSemantics] { override def preStart(): Unit = cluster.subscribe(self, classOf[ClusterDomainEvent]) override def postStop(): Unit = cluster.unsubscribe(self) diff --git a/akka-docs/rst/scala/code/docs/actor/ActorDocSpec.scala b/akka-docs/rst/scala/code/docs/actor/ActorDocSpec.scala index 14a98cab76..e0e8d0020a 100644 --- a/akka-docs/rst/scala/code/docs/actor/ActorDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/actor/ActorDocSpec.scala @@ -217,7 +217,6 @@ trait ConsumerBehavior { } } - class Producer extends Actor with ProducerBehavior { def receive = producerBehavior } @@ -226,10 +225,9 @@ class Consumer extends Actor with ActorLogging with ConsumerBehavior { def receive = consumerBehavior } - class ProducerConsumer extends Actor with ActorLogging with ProducerBehavior with ConsumerBehavior { - + def receive = producerBehavior orElse consumerBehavior } diff --git a/akka-persistence/src/main/scala/akka/persistence/Persistence.scala b/akka-persistence/src/main/scala/akka/persistence/Persistence.scala index 251c9de8c3..db9744e473 100644 --- a/akka-persistence/src/main/scala/akka/persistence/Persistence.scala +++ b/akka-persistence/src/main/scala/akka/persistence/Persistence.scala @@ -93,11 +93,11 @@ class Persistence(val system: ExtendedActorSystem) extends Extension { else DefaultPluginDispatcherId } - private val confirmationBatchLayer = system.asInstanceOf[ActorSystemImpl] - .systemActorOf(Props(classOf[DeliveredByChannelBatching], journal, settings), "confirmation-batch-layer") + private val confirmationBatchLayer = system.systemActorOf( + Props(classOf[DeliveredByChannelBatching], journal, settings), "confirmation-batch-layer") - private val deletionBatchLayer = system.asInstanceOf[ActorSystemImpl] - .systemActorOf(Props(classOf[DeliveredByPersistentChannelBatching], journal, settings), "deletion-batch-layer") + private val deletionBatchLayer = system.systemActorOf( + Props(classOf[DeliveredByPersistentChannelBatching], journal, settings), "deletion-batch-layer") /** * Creates a canonical processor id from a processor actor ref. @@ -145,7 +145,7 @@ class Persistence(val system: ExtendedActorSystem) extends Extension { val pluginClassName = pluginConfig.getString("class") val pluginClass = system.dynamicAccess.getClassFor[AnyRef](pluginClassName).get val pluginDispatcherId = if (pluginConfig.hasPath("plugin-dispatcher")) pluginConfig.getString("plugin-dispatcher") else dispatcherSelector(pluginClass) - system.asInstanceOf[ActorSystemImpl].systemActorOf(Props(pluginClass).withDispatcher(pluginDispatcherId), pluginType) + system.systemActorOf(Props(pluginClass).withDispatcher(pluginDispatcherId), pluginType) } private def id(ref: ActorRef) = ref.path.toStringWithoutAddress diff --git a/akka-remote/src/main/scala/akka/remote/Remoting.scala b/akka-remote/src/main/scala/akka/remote/Remoting.scala index c4df325c04..6f81a30d16 100644 --- a/akka-remote/src/main/scala/akka/remote/Remoting.scala +++ b/akka-remote/src/main/scala/akka/remote/Remoting.scala @@ -114,7 +114,7 @@ private[remote] class Remoting(_system: ExtendedActorSystem, _provider: RemoteAc import provider.remoteSettings._ - val transportSupervisor = system.asInstanceOf[ActorSystemImpl].systemActorOf( + val transportSupervisor = system.systemActorOf( configureDispatcher(Props[TransportSupervisor]), "transports") @@ -159,7 +159,7 @@ private[remote] class Remoting(_system: ExtendedActorSystem, _provider: RemoteAc endpointManager match { case None ⇒ log.info("Starting remoting") - val manager: ActorRef = system.asInstanceOf[ActorSystemImpl].systemActorOf( + val manager: ActorRef = system.systemActorOf( configureDispatcher(Props(classOf[EndpointManager], provider.remoteSettings.config, log)).withDeploy(Deploy.local), Remoting.EndpointManagerName) endpointManager = Some(manager) diff --git a/akka-testkit/src/main/scala/akka/testkit/TestKit.scala b/akka-testkit/src/main/scala/akka/testkit/TestKit.scala index bd0d99dd30..8d5614c65b 100644 --- a/akka-testkit/src/main/scala/akka/testkit/TestKit.scala +++ b/akka-testkit/src/main/scala/akka/testkit/TestKit.scala @@ -120,7 +120,7 @@ trait TestKitBase { * registration as message target. */ val testActor: ActorRef = { - val impl = system.asInstanceOf[ActorSystemImpl] //TODO ticket #1559 + val impl = system.asInstanceOf[ExtendedActorSystem] val ref = impl.systemActorOf(TestActor.props(queue) .withDispatcher(CallingThreadDispatcher.Id), "testActor" + TestKit.testActorId.incrementAndGet)