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.
+ *
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) {