diff --git a/akka-core/src/main/scala/routing/Listeners.scala b/akka-core/src/main/scala/routing/Listeners.scala index 7b989836a5..4bfc3f30b6 100644 --- a/akka-core/src/main/scala/routing/Listeners.scala +++ b/akka-core/src/main/scala/routing/Listeners.scala @@ -6,26 +6,34 @@ package se.scalablesolutions.akka.patterns import se.scalablesolutions.akka.actor.{Actor, ActorRef} +import java.util.concurrent.CopyOnWriteArraySet + sealed trait ListenerMessage case class Listen(listener: ActorRef) extends ListenerMessage case class Deafen(listener: ActorRef) extends ListenerMessage -case class WithListeners(f: Set[ActorRef] => Unit) extends ListenerMessage +case class WithListeners(f: List[ActorRef] => Unit) extends ListenerMessage -/** Listeners is a generic trait to implement listening capability on an Actor - * Use the gossip(msg) method to have it sent to the listenees - * Send Listen(self) to start listening - * Send Deafen(self) to stop listening - * Send WithListeners(fun) to traverse the current listeners +/** + * Listeners is a generic trait to implement listening capability on an Actor. + *

+ * Use the gossip(msg) method to have it sent to the listeners. + *

+ * Send Listen(self) to start listening. + *

+ * Send Deafen(self) to stop listening. + *

+ * Send WithListeners(fun) to traverse the current listeners. */ -trait Listeners { self : Actor => - import se.scalablesolutions.akka.actor.Agent - private lazy val listeners = Agent(Set[ActorRef]()) +trait Listeners { self: Actor => + private val listeners = new CopyOnWriteArraySet[ActorRef] - protected def listenerManagement : Receive = { - case Listen(l) => listeners( _ + l) - case Deafen(l) => listeners( _ - l ) - case WithListeners(f) => listeners foreach f + protected def listenerManagement: Receive = { + case Listen(l) => listeners add l + case Deafen(l) => listeners remove l + case WithListeners(f) => f(listenersAsList) } - protected def gossip(msg : Any) = listeners foreach ( _ foreach ( _ ! msg ) ) + protected def gossip(msg: Any) = listenersAsList foreach (_ ! msg) + + private def listenersAsList: List[ActorRef] = listeners.toArray.toList.asInstanceOf[List[ActorRef]] } diff --git a/project/build/AkkaProject.scala b/project/build/AkkaProject.scala index 3e7935e941..dc3b8f74f5 100644 --- a/project/build/AkkaProject.scala +++ b/project/build/AkkaProject.scala @@ -223,7 +223,7 @@ class AkkaParent(info: ProjectInfo) extends DefaultProject(info) { class AkkaRedisProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { val redis = "com.redis" % "redisclient" % "2.8.0.RC2-1.4-SNAPSHOT" % "compile" - //override def testOptions = TestFilter((name: String) => name.endsWith("Test")) :: Nil + override def testOptions = TestFilter((name: String) => name.endsWith("Test")) :: Nil } class AkkaMongoProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) {