pekko/akka-remote/src/main/scala/akka/remote/NetworkEventStream.scala
Patrik Nordwall f772b0183e Initial commit of dispatcher key refactoring, for review. See #1458
* Changed signatures and constructor of MessageDispatcherConfigurator
* Changed Dispatchers.lookup, keep configurators instead of dispatchers
* Removed most of the Dispatchers.newX methods, newDispatcher is still there because of priority mailbox
* How should we make it easy to configure priority mailbox?
* Changed tons tests
* Documentation and ScalaDoc is not updated yet
* Some tests in ActorModelSpec are temporary ignored due to failure
2011-12-21 13:27:50 +01:00

78 lines
2.4 KiB
Scala

/**
* Copyright (C) 2009-2011 Typesafe Inc. <http://www.typesafe.com>
*/
package akka.remote
import scala.collection.mutable
import akka.actor.{ LocalActorRef, Actor, ActorRef, Props, newUuid }
import akka.actor.Actor._
import akka.actor.ActorSystemImpl
/**
* Stream of all kinds of network events, remote failure and connection events, cluster failure and connection events etc.
* Also provides API for sender listener management.
*/
object NetworkEventStream {
private sealed trait NetworkEventStreamEvent
private case class Register(listener: Listener, connectionAddress: ParsedTransportAddress)
extends NetworkEventStreamEvent
private case class Unregister(listener: Listener, connectionAddress: ParsedTransportAddress)
extends NetworkEventStreamEvent
/**
* Base trait for network event listener.
*/
trait Listener {
def notify(event: RemoteLifeCycleEvent)
}
/**
* Channel actor with a registry of listeners.
*/
private class Channel extends Actor {
val listeners = new mutable.HashMap[ParsedTransportAddress, mutable.Set[Listener]]() {
override def default(k: ParsedTransportAddress) = mutable.Set.empty[Listener]
}
def receive = {
case event: RemoteClientLifeCycleEvent
listeners(event.remoteAddress) foreach (_ notify event)
case event: RemoteServerLifeCycleEvent // FIXME handle RemoteServerLifeCycleEvent, ticket #1408 and #1190
case Register(listener, connectionAddress)
listeners(connectionAddress) += listener
case Unregister(listener, connectionAddress)
listeners(connectionAddress) -= listener
case _ //ignore other
}
}
}
class NetworkEventStream(system: ActorSystemImpl) {
import NetworkEventStream._
// FIXME: check that this supervision is correct, ticket #1408
private[akka] val sender =
system.systemActorOf(Props[Channel].withDispatcher("akka.remote.network-event-sender-dispatcher"), "network-event-sender")
/**
* Registers a network event stream listener (asyncronously).
*/
def register(listener: Listener, connectionAddress: ParsedTransportAddress) =
sender ! Register(listener, connectionAddress)
/**
* Unregisters a network event stream listener (asyncronously) .
*/
def unregister(listener: Listener, connectionAddress: ParsedTransportAddress) =
sender ! Unregister(listener, connectionAddress)
}