Added interface for registering session actors, and adding unit test (which is failing now)

This commit is contained in:
Paul Pacheco 2010-11-14 13:10:13 -06:00
parent 5dff29642d
commit 67cf3788f3
3 changed files with 82 additions and 0 deletions

View file

@ -302,6 +302,17 @@ class RemoteServer extends Logging with ListenerManagement {
else register(id, actorRef, actors)
}
/**
* Register Remote Session Actor by a specific 'id' passed as argument.
* <p/>
* NOTE: If you use this method to register your remote actor then you must unregister the actor by this ID yourself.
*/
def registerPerSession(id: String, factory: => ActorRef): Unit = synchronized {
log.debug("Registering server side remote session actor with id [%s]", id)
if (id.startsWith(UUID_PREFIX)) register(id.substring(UUID_PREFIX.length), factory, actorsByUuid)
else registerPerSession(id, () => factory, actorsFactories)
}
private def register[Key](id: Key, actorRef: ActorRef, registry: ConcurrentHashMap[Key, ActorRef]) {
if (_isRunning && !registry.contains(id)) {
if (!actorRef.isRunning) actorRef.start
@ -309,6 +320,12 @@ class RemoteServer extends Logging with ListenerManagement {
}
}
private def registerPerSession[Key](id: Key, factory: () => ActorRef, registry: ConcurrentHashMap[Key,() => ActorRef]) {
if (_isRunning && !registry.contains(id)) {
registry.put(id, factory)
}
}
private def registerTypedActor[Key](id: Key, typedActor: AnyRef, registry: ConcurrentHashMap[Key, AnyRef]) {
if (_isRunning && !registry.contains(id)) registry.put(id, typedActor)
}
@ -341,6 +358,18 @@ class RemoteServer extends Logging with ListenerManagement {
}
}
/**
* Unregister Remote Actor by specific 'id'.
* <p/>
* NOTE: You need to call this method if you have registered an actor by a custom ID.
*/
def unregisterPerSession(id: String):Unit = synchronized {
if (_isRunning) {
log.info("Unregistering server side remote session actor with id [%s]", id)
actorsFactories.remove(id)
}
}
/**
* Unregister Remote Typed Actor by specific 'id'.
* <p/>
@ -358,8 +387,10 @@ class RemoteServer extends Logging with ListenerManagement {
protected[akka] override def notifyListeners(message: => Any): Unit = super.notifyListeners(message)
private[akka] def actors = ActorRegistry.actors(address)
private[akka] def actorsByUuid = ActorRegistry.actorsByUuid(address)
private[akka] def actorsFactories = ActorRegistry.actorsFactories(address)
private[akka] def typedActors = ActorRegistry.typedActors(address)
private[akka] def typedActorsByUuid = ActorRegistry.typedActorsByUuid(address)
}
@ -429,6 +460,8 @@ class RemoteServerHandler(
val AW_PROXY_PREFIX = "$$ProxiedByAW".intern
val CHANNEL_INIT = "channel-init".intern
val sessionActors = new ChannelLocal();
applicationLoader.foreach(MessageSerializer.setClassLoader(_))
/**