diff --git a/akka-core/src/main/scala/actor/Actor.scala b/akka-core/src/main/scala/actor/Actor.scala index e0c6de0f5c..4a52da74b6 100644 --- a/akka-core/src/main/scala/actor/Actor.scala +++ b/akka-core/src/main/scala/actor/Actor.scala @@ -433,10 +433,6 @@ trait Actor extends TransactionManagement with Logging { def start: Actor = synchronized { if (_isShutDown) throw new IllegalStateException("Can't restart an actor that has been shut down with 'exit'") if (!_isRunning) { - if (messageDispatcher.isShutdown && - messageDispatcher.isInstanceOf[Dispatchers.globalExecutorBasedEventDrivenDispatcher.type]) { - messageDispatcher.asInstanceOf[ExecutorBasedEventDrivenDispatcher].init - } messageDispatcher.register(this) messageDispatcher.start _isRunning = true @@ -459,7 +455,6 @@ trait Actor extends TransactionManagement with Logging { def stop = synchronized { if (_isRunning) { messageDispatcher.unregister(this) - if (messageDispatcher.canBeShutDown) messageDispatcher.shutdown // shut down in the dispatcher's references is zero _isRunning = false _isShutDown = true shutdown diff --git a/akka-core/src/main/scala/dispatch/AbstractReactorBasedEventDrivenDispatcher.scala b/akka-core/src/main/scala/dispatch/AbstractReactorBasedEventDrivenDispatcher.scala index 332798154a..3727e8ca92 100644 --- a/akka-core/src/main/scala/dispatch/AbstractReactorBasedEventDrivenDispatcher.scala +++ b/akka-core/src/main/scala/dispatch/AbstractReactorBasedEventDrivenDispatcher.scala @@ -25,7 +25,7 @@ abstract class AbstractReactorBasedEventDrivenDispatcher(val name: String) exten override def unregister(actor: Actor) = synchronized { messageInvokers.remove(actor) - super.register(actor) + super.unregister(actor) } def shutdown = if (active) { diff --git a/akka-core/src/main/scala/dispatch/Dispatchers.scala b/akka-core/src/main/scala/dispatch/Dispatchers.scala index 554be1106b..49d9c624b6 100644 --- a/akka-core/src/main/scala/dispatch/Dispatchers.scala +++ b/akka-core/src/main/scala/dispatch/Dispatchers.scala @@ -39,7 +39,14 @@ import se.scalablesolutions.akka.actor.Actor * @author Jonas Bonér */ object Dispatchers { - object globalExecutorBasedEventDrivenDispatcher extends ExecutorBasedEventDrivenDispatcher("global") + object globalExecutorBasedEventDrivenDispatcher extends ExecutorBasedEventDrivenDispatcher("global") { + override def register(actor : Actor) = { + if (isShutdown) + init + super.register(actor) + } + } + object globalReactorBasedSingleThreadEventDrivenDispatcher extends ReactorBasedSingleThreadEventDrivenDispatcher("global") object globalReactorBasedThreadPoolEventDrivenDispatcher extends ReactorBasedThreadPoolEventDrivenDispatcher("global") diff --git a/akka-core/src/main/scala/dispatch/Reactor.scala b/akka-core/src/main/scala/dispatch/Reactor.scala index 627d27aeac..8aee0075ad 100644 --- a/akka-core/src/main/scala/dispatch/Reactor.scala +++ b/akka-core/src/main/scala/dispatch/Reactor.scala @@ -63,7 +63,11 @@ trait MessageDispatcher extends Logging { def start def shutdown def register(actor: Actor) = references.put(actor.uuid, actor) - def unregister(actor: Actor) = references.remove(actor.uuid) + def unregister(actor: Actor) = { + references.remove(actor.uuid) + if (canBeShutDown) + shutdown // shut down in the dispatcher's references is zero + } def canBeShutDown: Boolean = references.isEmpty def isShutdown: Boolean }