Adding docs
This commit is contained in:
parent
3233da1e44
commit
c97c887791
7 changed files with 41 additions and 7 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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._
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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._
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 = {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue