Re-enable akka-kernel and add small sample
Created a new simple version of the microkernel for inclusion in the akka download and to be able to start working on sample applications
This commit is contained in:
parent
66e7155ef1
commit
ba9ed982ca
19 changed files with 247 additions and 531 deletions
19
akka-kernel/src/main/resources/reference.conf
Normal file
19
akka-kernel/src/main/resources/reference.conf
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
#####################################
|
||||
# Akka Kernel Reference Config File #
|
||||
#####################################
|
||||
|
||||
# This reference config file has all the default settings
|
||||
# Make your edits/overrides in your akka.conf
|
||||
|
||||
|
||||
akka {
|
||||
|
||||
kernel {
|
||||
# The name of the actor system created by the Akka Microkernel
|
||||
system.name = "default"
|
||||
|
||||
# Boot classes are loaded and created automatically when the Akka Microkernel starts up
|
||||
# A list of FQNs (Fully Qualified Names) of classes that implement akka.kernel.Bootable
|
||||
boot = []
|
||||
}
|
||||
}
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
/**
|
||||
* Copyright (C) 2009-2011 Typesafe Inc. <http://www.typesafe.com>
|
||||
*/
|
||||
|
||||
package akka.http
|
||||
|
||||
import akka.config.Config
|
||||
import akka.util.{ Bootable, AkkaLoader }
|
||||
import akka.cluster.BootableRemoteActorService
|
||||
import akka.actor.BootableActorLoaderService
|
||||
|
||||
class DefaultAkkaLoader extends AkkaLoader {
|
||||
def boot(): Unit = boot(true, new EmbeddedAppServer with BootableActorLoaderService with BootableRemoteActorService)
|
||||
}
|
||||
|
||||
/**
|
||||
* Can be used to boot Akka
|
||||
*
|
||||
* java -cp ... akka.http.Main
|
||||
*/
|
||||
object Main extends DefaultAkkaLoader {
|
||||
def main(args: Array[String]) = boot
|
||||
}
|
||||
|
|
@ -1,73 +0,0 @@
|
|||
/**
|
||||
* Copyright (C) 2009-2011 Typesafe Inc. <http://www.typesafe.com>
|
||||
*/
|
||||
|
||||
package akka.http
|
||||
|
||||
import javax.ws.rs.core.UriBuilder
|
||||
import javax.servlet.ServletConfig
|
||||
import java.io.File
|
||||
|
||||
import akka.actor.BootableActorLoaderService
|
||||
import akka.util.Bootable
|
||||
|
||||
import org.eclipse.jetty.xml.XmlConfiguration
|
||||
import org.eclipse.jetty.server.{ Handler, Server }
|
||||
import org.eclipse.jetty.server.handler.{ HandlerList, HandlerCollection, ContextHandler }
|
||||
import java.net.URL
|
||||
import akka.AkkaException
|
||||
|
||||
/**
|
||||
* Handles the Akka Comet Support (load/unload)
|
||||
*/
|
||||
trait EmbeddedAppServer extends Bootable {
|
||||
self: BootableActorLoaderService ⇒
|
||||
|
||||
import akka.config.Config._
|
||||
|
||||
val REST_HOSTNAME = config.getString("akka.http.hostname", "localhost")
|
||||
val REST_PORT = config.getInt("akka.http.port", 9998)
|
||||
|
||||
val isRestEnabled = config.getList("akka.enabled-modules").exists(_ == "http")
|
||||
|
||||
protected var server: Option[Server] = None
|
||||
|
||||
protected def findJettyConfigXML: Option[URL] =
|
||||
Option(applicationLoader.getOrElse(this.getClass.getClassLoader).getResource("microkernel-server.xml")) orElse
|
||||
HOME.map(home ⇒ new File(home + "/config/microkernel-server.xml").toURI.toURL)
|
||||
|
||||
abstract override def onLoad = {
|
||||
super.onLoad
|
||||
if (isRestEnabled) {
|
||||
|
||||
val configuration = new XmlConfiguration(findJettyConfigXML.getOrElse(sys.error("microkernel-server.xml not found!")))
|
||||
|
||||
System.setProperty("jetty.port", REST_PORT.toString)
|
||||
System.setProperty("jetty.host", REST_HOSTNAME)
|
||||
|
||||
HOME.foreach(home ⇒ System.setProperty("jetty.home", home + "/deploy/root"))
|
||||
|
||||
server = Option(configuration.configure.asInstanceOf[Server]) map { s ⇒ //Set the correct classloader to our contexts
|
||||
applicationLoader foreach { loader ⇒
|
||||
//We need to provide the correct classloader to the servlets
|
||||
def setClassLoader(handlers: Seq[Handler]) {
|
||||
handlers foreach {
|
||||
case c: ContextHandler ⇒ c.setClassLoader(loader)
|
||||
case c: HandlerCollection ⇒ setClassLoader(c.getHandlers)
|
||||
case _ ⇒
|
||||
}
|
||||
}
|
||||
setClassLoader(s.getHandlers)
|
||||
}
|
||||
//Start the server
|
||||
s.start()
|
||||
s
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
abstract override def onUnload = {
|
||||
super.onUnload
|
||||
server foreach { _.stop() }
|
||||
}
|
||||
}
|
||||
|
|
@ -1,36 +0,0 @@
|
|||
/**
|
||||
* Copyright (C) 2009-2010 Typesafe Inc. <http://www.typesafe.com>
|
||||
*/
|
||||
|
||||
package akka.kernel
|
||||
|
||||
import akka.http.EmbeddedAppServer
|
||||
import akka.util.AkkaLoader
|
||||
import akka.cluster.BootableRemoteActorService
|
||||
import akka.actor.BootableActorLoaderService
|
||||
import akka.camel.CamelService
|
||||
|
||||
import java.util.concurrent.CountDownLatch
|
||||
|
||||
object Main {
|
||||
val keepAlive = new CountDownLatch(2)
|
||||
|
||||
def main(args: Array[String]) = {
|
||||
Kernel.boot
|
||||
keepAlive.await
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The Akka Kernel, is used to start And postStop Akka in standalone/kernel mode.
|
||||
*/
|
||||
object Kernel extends AkkaLoader {
|
||||
|
||||
def boot(): Unit = boot(true, new EmbeddedAppServer with BootableActorLoaderService with BootableRemoteActorService with CamelService)
|
||||
|
||||
// For testing purposes only
|
||||
def startRemoteService(): Unit = bundles.foreach(_ match {
|
||||
case x: BootableRemoteActorService ⇒ x.startRemoteService()
|
||||
case _ ⇒
|
||||
})
|
||||
}
|
||||
143
akka-kernel/src/main/scala/akka/kernel/Main.scala
Normal file
143
akka-kernel/src/main/scala/akka/kernel/Main.scala
Normal file
|
|
@ -0,0 +1,143 @@
|
|||
/**
|
||||
* Copyright (C) 2009-2010 Typesafe Inc. <http://www.typesafe.com>
|
||||
*/
|
||||
|
||||
package akka.kernel
|
||||
|
||||
import akka.actor.ActorSystem
|
||||
import com.typesafe.config.ConfigFactory
|
||||
import java.io.File
|
||||
import java.lang.Boolean.getBoolean
|
||||
import java.net.{ URL, URLClassLoader }
|
||||
import java.util.jar.JarFile
|
||||
import scala.collection.JavaConverters._
|
||||
|
||||
trait Bootable {
|
||||
def startup(system: ActorSystem): Unit
|
||||
def shutdown(system: ActorSystem): Unit
|
||||
}
|
||||
|
||||
object Main {
|
||||
val quiet = getBoolean("akka.kernel.quiet")
|
||||
|
||||
def log(s: String) = if (!quiet) println(s)
|
||||
|
||||
def main(args: Array[String]) = {
|
||||
log(banner)
|
||||
log("Starting Akka...")
|
||||
log("Running Akka " + ActorSystem.Version)
|
||||
|
||||
val config = ConfigFactory.load("akka.conf")
|
||||
val name = config.getString("akka.kernel.system.name")
|
||||
val system = ActorSystem(name, config)
|
||||
val classLoader = deployJars(system)
|
||||
|
||||
log("Created actor system '%s'" format name)
|
||||
|
||||
Thread.currentThread.setContextClassLoader(classLoader)
|
||||
|
||||
val bootClasses: Seq[String] = system.settings.config.getStringList("akka.kernel.boot").asScala
|
||||
val bootables: Seq[Bootable] = bootClasses map { c ⇒ classLoader.loadClass(c).newInstance.asInstanceOf[Bootable] }
|
||||
|
||||
for (bootable ← bootables) {
|
||||
log("Starting up " + bootable.getClass.getName)
|
||||
bootable.startup(system)
|
||||
}
|
||||
|
||||
addShutdownHook(system, bootables)
|
||||
|
||||
log("Successfully started Akka")
|
||||
}
|
||||
|
||||
def deployJars(system: ActorSystem): ClassLoader = {
|
||||
if (system.settings.Home.isEmpty) {
|
||||
log("Akka home is not defined")
|
||||
System.exit(1)
|
||||
Thread.currentThread.getContextClassLoader
|
||||
} else {
|
||||
val home = system.settings.Home.get
|
||||
val deploy = new File(home, "deploy")
|
||||
|
||||
if (!deploy.exists) {
|
||||
log("No deploy dir found at " + deploy)
|
||||
log("Please check that akka home is defined correctly")
|
||||
System.exit(1)
|
||||
}
|
||||
|
||||
val jars = deploy.listFiles.filter(_.getName.endsWith(".jar"))
|
||||
|
||||
val nestedJars = jars flatMap { jar ⇒
|
||||
val jarFile = new JarFile(jar)
|
||||
val jarEntries = jarFile.entries.asScala.toArray.filter(_.getName.endsWith(".jar"))
|
||||
jarEntries map { entry ⇒ new File("jar:file:%s!/%s" format (jarFile.getName, entry.getName)) }
|
||||
}
|
||||
|
||||
val urls = (jars ++ nestedJars) map { _.toURI.toURL }
|
||||
|
||||
urls foreach { url ⇒ log("Deploying " + url) }
|
||||
|
||||
new URLClassLoader(urls, Thread.currentThread.getContextClassLoader)
|
||||
}
|
||||
}
|
||||
|
||||
def addShutdownHook(system: ActorSystem, bootables: Seq[Bootable]): Unit = {
|
||||
Runtime.getRuntime.addShutdownHook(new Thread(new Runnable {
|
||||
def run = {
|
||||
log("")
|
||||
log("Received signal to stop")
|
||||
log("Shutting down Akka...")
|
||||
for (bootable ← bootables) {
|
||||
log("Shutting down " + bootable.getClass.getName)
|
||||
bootable.shutdown(system)
|
||||
}
|
||||
system.stop()
|
||||
log("Successfully shut down Akka")
|
||||
}
|
||||
}))
|
||||
}
|
||||
|
||||
def banner = """
|
||||
==============================================================================
|
||||
|
||||
ZZ:
|
||||
ZZZZ
|
||||
ZZZZZZ
|
||||
ZZZ' ZZZ
|
||||
~7 7ZZ' ZZZ
|
||||
:ZZZ: IZZ' ZZZ
|
||||
,OZZZZ.~ZZ? ZZZ
|
||||
ZZZZ' 'ZZZ$ ZZZ
|
||||
. $ZZZ ~ZZ$ ZZZ
|
||||
.=Z?. .ZZZO ~ZZ7 OZZ
|
||||
.ZZZZ7..:ZZZ~ 7ZZZ ZZZ~
|
||||
.$ZZZ$Z+.ZZZZ ZZZ: ZZZ$
|
||||
.,ZZZZ?' =ZZO= .OZZ 'ZZZ
|
||||
.$ZZZZ+ .ZZZZ IZZZ ZZZ$
|
||||
.ZZZZZ' .ZZZZ' .ZZZ$ ?ZZZ
|
||||
.ZZZZZZ' .OZZZ? ?ZZZ 'ZZZ$
|
||||
.?ZZZZZZ' .ZZZZ? .ZZZ? 'ZZZO
|
||||
.+ZZZZZZ?' .7ZZZZ' .ZZZZ :ZZZZ
|
||||
.ZZZZZZ$' .?ZZZZZ' .~ZZZZ 'ZZZZ.
|
||||
|
||||
|
||||
NNNNN $NNNN+
|
||||
NNNNN $NNNN+
|
||||
NNNNN $NNNN+
|
||||
NNNNN $NNNN+
|
||||
NNNNN $NNNN+
|
||||
=NNNNNNNNND$ NNNNN DDDDDD: $NNNN+ DDDDDN NDDNNNNNNNN,
|
||||
NNNNNNNNNNNNND NNNNN DNNNNN $NNNN+ 8NNNNN= :NNNNNNNNNNNNNN
|
||||
NNNNN$ DNNNNN NNNNN $NNNNN~ $NNNN+ NNNNNN NNNNN, :NNNNN+
|
||||
?DN~ NNNNN NNNNN MNNNNN $NNNN+:NNNNN7 $ND =NNNNN
|
||||
DNNNNN NNNNNDNNNN$ $NNNNDNNNNN :DNNNNN
|
||||
ZNDNNNNNNNNND NNNNNNNNNND, $NNNNNNNNNNN DNDNNNNNNNNNN
|
||||
NNNNNNNDDINNNNN NNNNNNNNNNND $NNNNNNNNNNND ONNNNNNND8+NNNNN
|
||||
:NNNND NNNNN NNNNNN DNNNN, $NNNNNO 7NNNND NNNNNO :NNNNN
|
||||
DNNNN NNNNN NNNNN DNNNN $NNNN+ 8NNNNN NNNNN $NNNNN
|
||||
DNNNNO NNNNNN NNNNN NNNNN $NNNN+ NNNNN$ NNNND, ,NNNNND
|
||||
NNNNNNDDNNNNNNNN NNNNN =NNNNN $NNNN+ DNNNN? DNNNNNNDNNNNNNNND
|
||||
NNNNNNNNN NNNN$ NNNNN 8NNNND $NNNN+ NNNNN= ,DNNNNNNND NNNNN$
|
||||
|
||||
==============================================================================
|
||||
"""
|
||||
}
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
/**
|
||||
* Copyright (C) 2009-2011 Typesafe Inc. <http://www.typesafe.com>
|
||||
*/
|
||||
|
||||
package akka.servlet
|
||||
|
||||
import akka.cluster.BootableRemoteActorService
|
||||
import akka.actor.BootableActorLoaderService
|
||||
import akka.config.Config
|
||||
import akka.util.{ Bootable, AkkaLoader }
|
||||
|
||||
import javax.servlet.{ ServletContextListener, ServletContextEvent }
|
||||
|
||||
/**
|
||||
* This class can be added to web.xml mappings as a listener to start and postStop Akka.
|
||||
*
|
||||
* <web-system>
|
||||
* ...
|
||||
* <listener>
|
||||
* <listener-class>akka.servlet.Initializer</listener-class>
|
||||
* </listener>
|
||||
* ...
|
||||
* </web-system>
|
||||
*/
|
||||
class Initializer extends ServletContextListener {
|
||||
lazy val loader = new AkkaLoader
|
||||
|
||||
def contextDestroyed(e: ServletContextEvent): Unit =
|
||||
loader.shutdown
|
||||
|
||||
def contextInitialized(e: ServletContextEvent): Unit =
|
||||
loader.boot(true, new BootableActorLoaderService with BootableRemoteActorService)
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue