Microkernel (Scala)
The purpose of the Akka Microkernel is to offer a bundling mechanism so that you can distribute an Akka application as a single payload, without the need to run in a Java Application Server or manually having to create a launcher script.
The Akka Microkernel is included in the Akka download found at downloads.
To run an application with the microkernel you need to create a Bootable class that handles the startup and shutdown the application. An example is included below.
Put your application jar in the deploy directory to have it automatically loaded.
To start the kernel use the scripts in the bin directory, passing the boot classes for your application. Example command (on a unix-based system):
bin/akka sample.kernel.hello.HelloKernel
Use Ctrl-C to interrupt and exit the microkernel.
On a Windows machine you can also use the bin/akka.bat script.
The code for the Hello Kernel example (see the HelloKernel class for an example of creating a Bootable):
/**
* Copyright (C) 2009-2013 Typesafe Inc. <http://www.typesafe.com>
*/
package sample.kernel.hello
import akka.actor.{ Actor, ActorSystem, Props }
import akka.kernel.Bootable
case object Start
class HelloActor extends Actor {
val worldActor = context.actorOf(Props[WorldActor])
def receive = {
case Start ⇒ worldActor ! "Hello"
case message: String ⇒
println("Received message '%s'" format message)
}
}
class WorldActor extends Actor {
def receive = {
case message: String ⇒ sender ! (message.toUpperCase + " world!")
}
}
class HelloKernel extends Bootable {
val system = ActorSystem("hellokernel")
def startup = {
system.actorOf(Props[HelloActor]) ! Start
}
def shutdown = {
system.shutdown()
}
}
Distribution of microkernel application
To make a distribution package of the microkernel and your application the akka-sbt-plugin provides AkkaKernelPlugin. It creates the directory structure, with jar files, configuration files and start scripts.
To use the sbt plugin you define it in your project/plugins.sbt:
addSbtPlugin("com.typesafe.akka" % "akka-sbt-plugin" % "2.1.4")
Then you add it to the settings of your project/Build.scala. It is also important that you add the akka-kernel dependency. This is an example of a complete sbt build file:
import sbt._
import Keys._
import akka.sbt.AkkaKernelPlugin
import akka.sbt.AkkaKernelPlugin.{ Dist, outputDirectory, distJvmOptions}
object HelloKernelBuild extends Build {
val Organization = "akka.sample"
val Version = "2.1.4"
val ScalaVersion = "2.10.1"
lazy val HelloKernel = Project(
id = "hello-kernel",
base = file("."),
settings = defaultSettings ++ AkkaKernelPlugin.distSettings ++ Seq(
libraryDependencies ++= Dependencies.helloKernel,
distJvmOptions in Dist := "-Xms256M -Xmx1024M",
outputDirectory in Dist := file("target/hello-dist")
)
)
lazy val buildSettings = Defaults.defaultSettings ++ Seq(
organization := Organization,
version := Version,
scalaVersion := ScalaVersion,
crossPaths := false,
organizationName := "Typesafe Inc.",
organizationHomepage := Some(url("http://www.typesafe.com"))
)
lazy val defaultSettings = buildSettings ++ Seq(
resolvers += "Typesafe Repo" at "http://repo.typesafe.com/typesafe/releases/",
// compile options
scalacOptions ++= Seq("-encoding", "UTF-8", "-deprecation", "-unchecked"),
javacOptions ++= Seq("-Xlint:unchecked", "-Xlint:deprecation")
)
}
object Dependencies {
import Dependency._
val helloKernel = Seq(
akkaKernel, akkaSlf4j, logback
)
}
object Dependency {
// Versions
object V {
val Akka = "2.1.4"
}
val akkaKernel = "com.typesafe.akka" %% "akka-kernel" % V.Akka
val akkaSlf4j = "com.typesafe.akka" %% "akka-slf4j" % V.Akka
val logback = "ch.qos.logback" % "logback-classic" % "1.0.0"
}
Run the plugin with sbt:
> dist
> dist:clean
There are several settings that can be defined:
- outputDirectory - destination directory of the package, default target/dist
- distJvmOptions - JVM parameters to be used in the start script
- configSourceDirs - Configuration files are copied from these directories, default src/config, src/main/config, src/main/resources
- distMainClass - Kernel main class to use in start script
- libFilter - Filter of dependency jar files
- additionalLibs - Additional dependency jar files
Contents