Adding docs

This commit is contained in:
Viktor Klang 2009-12-26 15:09:44 +01:00
parent 3233da1e44
commit c97c887791
7 changed files with 41 additions and 7 deletions

View file

@ -12,6 +12,14 @@ import scala.reflect.{BeanProperty}
sealed trait ClusterCometMessageType sealed trait ClusterCometMessageType
case class ClusterCometBroadcast(val name : String, val msg : AnyRef) extends ClusterCometMessageType case class ClusterCometBroadcast(val name : String, val msg : AnyRef) extends ClusterCometMessageType
/**
* Enables explicit clustering of Atmosphere (Comet) resources
* Annotate the endpoint which has the @Broadcast annotation with
* @org.atmosphere.annotation.Cluster(Array(classOf[AkkClusterBroadcastFilter])){ name = "someUniqueName" }
* that's all folks!
* Note: In the future, clustering comet will be transparent
*/
class AkkaClusterBroadcastFilter extends Actor with ClusterBroadcastFilter[AnyRef] { class AkkaClusterBroadcastFilter extends Actor with ClusterBroadcastFilter[AnyRef] {
@BeanProperty var clusterName = "" @BeanProperty var clusterName = ""
@BeanProperty var broadcaster : Broadcaster = null @BeanProperty var broadcaster : Broadcaster = null

View file

@ -46,11 +46,19 @@ class AkkaCometServlet extends org.atmosphere.cpr.AtmosphereServlet with Logging
} }
} }
/**
* We override this to avoid Atmosphere looking for it's atmosphere.xml file
* Instead we specify what semantics we want in code.
*/
override def loadConfiguration(sc: ServletConfig) { override def loadConfiguration(sc: ServletConfig) {
config = new AtmosphereConfig { supportSession = false } config = new AtmosphereConfig { supportSession = false }
atmosphereHandlers.put("/*", new AtmosphereServlet.AtmosphereHandlerWrapper(servlet, new JerseyBroadcaster)) atmosphereHandlers.put("/*", new AtmosphereServlet.AtmosphereHandlerWrapper(servlet, new JerseyBroadcaster))
} }
/**
* This method is overridden because Akka Kernel is bundles with Grizzly, so if we deploy the Kernel in another container,
* we need to handle that.
*/
override def createCometSupportResolver() : CometSupportResolver = { override def createCometSupportResolver() : CometSupportResolver = {
import org.scala_tools.javautils.Imports._ import org.scala_tools.javautils.Imports._

View file

@ -12,7 +12,9 @@ import javax.ws.rs.core.UriBuilder
import se.scalablesolutions.akka.actor.BootableActorLoaderService import se.scalablesolutions.akka.actor.BootableActorLoaderService
import se.scalablesolutions.akka.util.{Bootable,Logging} import se.scalablesolutions.akka.util.{Bootable,Logging}
/**
* Handles the Akka Comet Support (load/unload)
*/
trait BootableCometActorService extends Bootable with Logging { trait BootableCometActorService extends Bootable with Logging {
self : BootableActorLoaderService => self : BootableActorLoaderService =>
@ -40,7 +42,7 @@ trait BootableCometActorService extends Bootable with Logging {
adapter.setServletInstance(new AkkaCometServlet) adapter.setServletInstance(new AkkaCometServlet)
adapter.setContextPath(uri.getPath) adapter.setContextPath(uri.getPath)
//Using autodetection for now //Using autodetection for now
adapter.addInitParameter("cometSupport", "org.atmosphere.container.GrizzlyCometSupport") //adapter.addInitParameter("cometSupport", "org.atmosphere.container.GrizzlyCometSupport")
if (HOME.isDefined) adapter.setRootFolder(HOME.get + "/deploy/root") if (HOME.isDefined) adapter.setRootFolder(HOME.get + "/deploy/root")
log.info("REST service root path [%s] and context path [%s]", adapter.getRootFolder, adapter.getContextPath) log.info("REST service root path [%s] and context path [%s]", adapter.getRootFolder, adapter.getContextPath)

View file

@ -8,6 +8,9 @@ import java.io.File
import java.net.URLClassLoader import java.net.URLClassLoader
import se.scalablesolutions.akka.util.{Bootable,Logging} import se.scalablesolutions.akka.util.{Bootable,Logging}
/**
* Handles all modules in the deploy directory (load and unload)
*/
trait BootableActorLoaderService extends Bootable with Logging { trait BootableActorLoaderService extends Bootable with Logging {
import Config._ import Config._

View file

@ -7,6 +7,11 @@ package se.scalablesolutions.akka.remote
import se.scalablesolutions.akka.actor.BootableActorLoaderService import se.scalablesolutions.akka.actor.BootableActorLoaderService
import se.scalablesolutions.akka.util.{Bootable,Logging} import se.scalablesolutions.akka.util.{Bootable,Logging}
/**
* This bundle/service is responsible for booting up and shutting down the remote actors facility
* It's used in Kernel
*/
trait BootableRemoteActorService extends Bootable with Logging { trait BootableRemoteActorService extends Bootable with Logging {
self : BootableActorLoaderService => self : BootableActorLoaderService =>
@ -19,15 +24,19 @@ trait BootableRemoteActorService extends Bootable with Logging {
def startRemoteService = remoteServerThread.start def startRemoteService = remoteServerThread.start
abstract override def onLoad = { abstract override def onLoad = {
super.onLoad super.onLoad //Make sure the actors facility is loaded before we load the remote service
if(config.getBool("akka.remote.server.service", true)) startRemoteService if(config.getBool("akka.remote.server.service", true)){
log.info("Initializing Remote Actors Service...")
startRemoteService
log.info("Remote Actors Service initialized!")
}
} }
abstract override def onUnload = { abstract override def onUnload = {
super.onUnload super.onUnload
if (remoteServerThread.isAlive) { if (remoteServerThread.isAlive) {
log.info("Shutting down remote service") log.info("Shutting down Remote Actors Service")
RemoteNode.shutdown RemoteNode.shutdown
remoteServerThread.join(1000) remoteServerThread.join(1000)
} }

View file

@ -151,7 +151,7 @@ class JGroupsClusterActor extends ClusterActor {
def receive = { def receive = {
case Zombie(x) => { //Ask the presumed zombie for papers and prematurely treat it as dead case Zombie(x) => { //Ask the presumed zombie for papers and prematurely treat it as dead
log debug ("Zombie: %s", x) log debug ("Killing Zombie Node: %s", x)
broadcast(x :: Nil, PapersPlease) broadcast(x :: Nil, PapersPlease)
remotes = remotes - x remotes = remotes - x
} }

View file

@ -26,6 +26,7 @@ object Kernel extends Logging {
private val startTime = System.currentTimeMillis private val startTime = System.currentTimeMillis
//Bundles is what modules are to be loaded with the Kernel, this uses Jonas' AOP style mixin pattern
object Bundles extends BootableActorLoaderService with BootableRemoteActorService with BootableCometActorService object Bundles extends BootableActorLoaderService with BootableRemoteActorService with BootableCometActorService
/** /**
@ -48,7 +49,9 @@ object Kernel extends Logging {
} }
} }
// TODO document Kernel.shutdown /**
* Shuts down the kernel, unloads all of the bundles
*/
def shutdown = synchronized { def shutdown = synchronized {
if (hasBooted) { if (hasBooted) {
log.info("Shutting down Akka...") log.info("Shutting down Akka...")
@ -57,6 +60,7 @@ object Kernel extends Logging {
} }
} }
//FIXME This is only being called by a test
def startRemoteService = Bundles.startRemoteService def startRemoteService = Bundles.startRemoteService
private def printBanner = { private def printBanner = {