Restructure loader to accommodate booting from a container

This commit is contained in:
Viktor Klang 2010-02-16 22:46:36 +01:00
parent 16d887fc0c
commit 2597cb2589
2 changed files with 21 additions and 15 deletions

View file

@ -2,13 +2,14 @@
* Copyright (C) 2009-2010 Scalable Solutions AB <http://scalablesolutions.se>
*/
package se.scalablesolutions.akka.comet
package se.scalablesolutions.akka
import com.sun.grizzly.http.SelectorThread
import com.sun.grizzly.http.servlet.ServletAdapter
import com.sun.grizzly.standalone.StaticStreamAlgorithm
import javax.ws.rs.core.UriBuilder
import se.scalablesolutions.akka.comet.AkkaServlet
import se.scalablesolutions.akka.actor.BootableActorLoaderService
import se.scalablesolutions.akka.util.{Bootable,Logging}

View file

@ -4,10 +4,9 @@
package se.scalablesolutions.akka
import se.scalablesolutions.akka.comet.BootableCometActorService
import se.scalablesolutions.akka.remote.BootableRemoteActorService
import se.scalablesolutions.akka.actor.BootableActorLoaderService
import se.scalablesolutions.akka.util.Logging
import se.scalablesolutions.akka.util.{Logging,Bootable}
import javax.servlet.{ServletContextListener, ServletContextEvent}
@ -26,27 +25,28 @@ object Kernel extends Logging {
private val startTime = System.currentTimeMillis
/**
* Bundles is what modules are to be loaded with the Kernel, this uses Jonas' AOP style mixin pattern.
* Holds a reference to the services that has been booted
*/
object Bundles extends BootableActorLoaderService with BootableRemoteActorService with BootableCometActorService
@volatile private var bundles : Option[Bootable] = None
/**
* Boots up the Kernel.
* Boots up the Kernel with default bootables
*/
def boot: Unit = boot(true)
def boot : Unit = boot(true, new BootableActorLoaderService with BootableRemoteActorService with BootableCometActorService)
/**
* Boots up the Kernel.
* If you pass in false as parameter then the Akka banner is not printed out.
*/
def boot(withBanner: Boolean): Unit = synchronized {
def boot(withBanner: Boolean, b : Bootable): Unit = synchronized {
if (!hasBooted) {
if (withBanner) printBanner
log.info("Starting Akka...")
Bundles.onLoad
b.onLoad
Thread.currentThread.setContextClassLoader(getClass.getClassLoader)
log.info("Akka started successfully")
hasBooted = true
bundles = Some(b)
}
}
@ -56,12 +56,17 @@ object Kernel extends Logging {
def shutdown = synchronized {
if (hasBooted) {
log.info("Shutting down Akka...")
Bundles.onUnload
bundles.foreach(_.onUnload)
bundles = None
log.info("Akka succesfully shut down")
}
}
def startRemoteService = Bundles.startRemoteService
//For testing purposes only
def startRemoteService : Unit = bundles.foreach( _ match {
case x : BootableRemoteActorService => x.startRemoteService
case _ =>
})
private def printBanner = {
log.info(
@ -85,5 +90,5 @@ object Kernel extends Logging {
class Kernel extends ServletContextListener {
def contextDestroyed(e : ServletContextEvent) : Unit = Kernel.shutdown
def contextInitialized(e : ServletContextEvent) : Unit = Kernel.boot
def contextInitialized(e : ServletContextEvent) : Unit = Kernel.boot(true,new BootableActorLoaderService with BootableRemoteActorService)
}