2011-09-09 14:33:35 +02:00
|
|
|
/**
|
|
|
|
|
* Copyright (C) 2009-2011 Typesafe Inc. <http://www.typesafe.com>
|
|
|
|
|
*/
|
|
|
|
|
|
2011-09-20 21:44:50 +02:00
|
|
|
package akka.remote
|
2011-09-09 14:33:35 +02:00
|
|
|
|
|
|
|
|
import scala.collection.mutable
|
2011-09-09 17:22:40 +02:00
|
|
|
import akka.actor.{ LocalActorRef, Actor, ActorRef, Props, newUuid }
|
|
|
|
|
import akka.actor.Actor._
|
2011-11-16 17:18:36 +01:00
|
|
|
import akka.actor.ActorSystemImpl
|
2011-09-09 14:33:35 +02:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Stream of all kinds of network events, remote failure and connection events, cluster failure and connection events etc.
|
2011-10-22 16:06:20 +02:00
|
|
|
* Also provides API for sender listener management.
|
2011-09-09 14:33:35 +02:00
|
|
|
*/
|
|
|
|
|
object NetworkEventStream {
|
|
|
|
|
|
|
|
|
|
private sealed trait NetworkEventStreamEvent
|
|
|
|
|
|
2011-12-11 20:00:26 +01:00
|
|
|
private case class Register(listener: Listener, connectionAddress: ParsedTransportAddress)
|
2011-09-09 14:33:35 +02:00
|
|
|
extends NetworkEventStreamEvent
|
|
|
|
|
|
2011-12-11 20:00:26 +01:00
|
|
|
private case class Unregister(listener: Listener, connectionAddress: ParsedTransportAddress)
|
2011-09-09 14:33:35 +02:00
|
|
|
extends NetworkEventStreamEvent
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Base trait for network event listener.
|
|
|
|
|
*/
|
|
|
|
|
trait Listener {
|
|
|
|
|
def notify(event: RemoteLifeCycleEvent)
|
|
|
|
|
}
|
2011-10-12 11:34:35 +02:00
|
|
|
|
2011-09-09 14:33:35 +02:00
|
|
|
/**
|
|
|
|
|
* Channel actor with a registry of listeners.
|
|
|
|
|
*/
|
|
|
|
|
private class Channel extends Actor {
|
|
|
|
|
|
2011-12-11 20:00:26 +01:00
|
|
|
val listeners = new mutable.HashMap[ParsedTransportAddress, mutable.Set[Listener]]() {
|
|
|
|
|
override def default(k: ParsedTransportAddress) = mutable.Set.empty[Listener]
|
2011-09-09 14:33:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
def receive = {
|
|
|
|
|
case event: RemoteClientLifeCycleEvent ⇒
|
|
|
|
|
listeners(event.remoteAddress) foreach (_ notify event)
|
|
|
|
|
|
2011-11-30 10:20:57 +01:00
|
|
|
case event: RemoteServerLifeCycleEvent ⇒ // FIXME handle RemoteServerLifeCycleEvent, ticket #1408 and #1190
|
2011-09-09 14:33:35 +02:00
|
|
|
|
|
|
|
|
case Register(listener, connectionAddress) ⇒
|
|
|
|
|
listeners(connectionAddress) += listener
|
|
|
|
|
|
|
|
|
|
case Unregister(listener, connectionAddress) ⇒
|
|
|
|
|
listeners(connectionAddress) -= listener
|
|
|
|
|
|
|
|
|
|
case _ ⇒ //ignore other
|
|
|
|
|
}
|
|
|
|
|
}
|
2011-10-13 17:42:26 +02:00
|
|
|
}
|
|
|
|
|
|
2011-11-17 12:36:35 +01:00
|
|
|
class NetworkEventStream(system: ActorSystemImpl) {
|
2011-10-13 17:42:26 +02:00
|
|
|
|
|
|
|
|
import NetworkEventStream._
|
2011-09-09 14:33:35 +02:00
|
|
|
|
2011-11-30 10:20:57 +01:00
|
|
|
// FIXME: check that this supervision is correct, ticket #1408
|
2011-11-29 16:32:50 +01:00
|
|
|
private[akka] val sender =
|
2011-12-20 21:08:27 +01:00
|
|
|
system.systemActorOf(Props[Channel].withDispatcher("akka.remote.network-event-sender-dispatcher"), "network-event-sender")
|
2011-09-09 14:33:35 +02:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Registers a network event stream listener (asyncronously).
|
|
|
|
|
*/
|
2011-12-11 20:00:26 +01:00
|
|
|
def register(listener: Listener, connectionAddress: ParsedTransportAddress) =
|
2011-10-22 16:06:20 +02:00
|
|
|
sender ! Register(listener, connectionAddress)
|
2011-09-09 14:33:35 +02:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Unregisters a network event stream listener (asyncronously) .
|
|
|
|
|
*/
|
2011-12-11 20:00:26 +01:00
|
|
|
def unregister(listener: Listener, connectionAddress: ParsedTransportAddress) =
|
2011-10-22 16:06:20 +02:00
|
|
|
sender ! Unregister(listener, connectionAddress)
|
2011-09-09 14:33:35 +02:00
|
|
|
}
|