|
Akka/Scala example source code file (Main.scala)
The Main.scala Akka example source code/** * Copyright (C) 2009-2014 Typesafe Inc. <http://www.typesafe.com> */ package akka.kernel import akka.actor.ActorSystem import java.io.File import java.lang.Boolean.getBoolean import java.net.URLClassLoader import java.util.jar.JarFile import scala.collection.immutable import scala.collection.JavaConverters._ /** * To use the microkernel at least one 'boot class' needs to be specified. * A boot class implements this interface ([[akka.kernel.Bootable]]) and * must have an empty default constructor. * * ActorSystems can be created within the boot class. * * An example of a simple boot class: * {{{ * class BootApp extends Bootable { * val system = ActorSystem("app") * * def startup = { * system.actorOf(Props[FirstActor]) ! FirstMessage * } * * def shutdown = { * system.shutdown() * } * } * }}} * * Boot classes are specified as main arguments to the microkernel. * * For example, using the akka script an application can be started with * the following at the command line: * {{{ * bin/akka org.app.BootApp * }}} */ trait Bootable { /** * Callback run on microkernel startup. * Create initial actors and messages here. */ def startup(): Unit /** * Callback run on microkernel shutdown. * Shutdown actor systems here. */ def shutdown(): Unit } /** * Main class for running the microkernel. */ object Main { private val quiet = getBoolean("akka.kernel.quiet") private def log(s: String) = if (!quiet) println(s) def main(args: Array[String]) = { if (args.isEmpty) { log("[error] No boot classes specified") System.exit(1) } log(banner) log("Starting Akka...") log("Running Akka " + ActorSystem.Version) val classLoader = createClassLoader() Thread.currentThread.setContextClassLoader(classLoader) val bootClasses: immutable.Seq[String] = args.to[immutable.Seq] val bootables: immutable.Seq[Bootable] = bootClasses map { c ⇒ classLoader.loadClass(c).newInstance.asInstanceOf[Bootable] } for (bootable ← bootables) { log("Starting up " + bootable.getClass.getName) bootable.startup() } addShutdownHook(bootables) log("Successfully started Akka") } private def createClassLoader(): ClassLoader = { if (ActorSystem.GlobalHome.isDefined) { val home = ActorSystem.GlobalHome.get val deploy = new File(home, "deploy") if (deploy.exists) { loadDeployJars(deploy) } else { log("[warning] No deploy dir found at " + deploy) Thread.currentThread.getContextClassLoader } } else { log("[warning] Akka home is not defined") Thread.currentThread.getContextClassLoader } } private def loadDeployJars(deploy: File): ClassLoader = { 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) } private def addShutdownHook(bootables: immutable.Seq[Bootable]): Unit = { Runtime.getRuntime.addShutdownHook(new Thread(new Runnable { def run = { log("") log("Shutting down Akka...") for (bootable ← bootables) { log("Shutting down " + bootable.getClass.getName) bootable.shutdown() } log("Successfully shut down Akka") } })) } private 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$ ============================================================================== """ } Other Akka source code examplesHere is a short list of links related to this Akka Main.scala source code file: |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.