A simple test project to test creating an Akka v2.1-SNAPSHOT ActorSystem inside of an OSGi context. Akka 2.1 will include OSGi support, bundling all of the subprojects. This project is based on the sbtosgi-examples project.
Initially, I attempted to execute this application in Felix, but ran into issues with the exposing of sun.misc.Unsafe. It is possible to configure Felix for bootdelegation of the package, but there is something wrong with the way akka.util.Unsafe is exposed at runtime, and I'm not sure how to get around that. Gert Vanthienen was able to get tests of his pull requests into Akka for OSGi support to work with Karaf and no extra configuration, so I switched to Karaf as well.
For what it's worth, the shell in Karaf is so much nicer than Felix as well. Felix has no history, no autocomplete and doesn't allow you to edit commands that you mistype. Karaf has all of these features and that makes it so much nicer to use. Good grief.
I have not tried this under Equinox.
- Clone this repo
- Make sure you're using SBT v0.11.3 (required for the sbtosgi 0.3.0-SNAPSHOT dependency, as it's not cross-built).
- At the command line at the root of the project, type
sbt update compile osgi-bundle
This information was shamelessly stolen from the sbtosgi-example project referenced above, though altered to reflect the runtime and requirements of this project.
To download Apache Karaf, visit this page and get the appropriate distribution for your environment. Untar it somewhere on your local drive, then go to that folder and start Karaf.
$ tar -xzf apache-karaf-2.2.7.tar.gz
$ cd apache-karaf-2.2.7
$ java -jar bin/karaf
You should see:
➜ apache-karaf-2.2.7 bin/karaf
__ __ ____
/ //_/____ __________ _/ __/
/ ,< / __ `/ ___/ __ `/ /_
/ /| |/ /_/ / / / /_/ / __/
/_/ |_|\__,_/_/ \__,_/_/
Apache Karaf (2.2.7)
Hit '<tab>' for a list of available commands
and '[cmd] --help' for help on a specific command.
Hit '<ctrl-d>' or 'osgi:shutdown' to shutdown Karaf.
karaf@root>
For a quick primer on how to use Karaf, see here.
Before you install this bundle, you'll need to add library bundles for the Scala language library, Akka-Actor and Typesafe Config as dependencies. See the lib folder for my pre-built artifacts, in case you don't want to build your own. Note that the Akka bundle is a 2.1-SNAPSHOT as of revision "35aaa220aa0c65333e75a7c199fe9ebc782c1b89" on May 29, 2012, but the dependency on Typesafe Config has been changed to 0.4.2-SNAPSHOT. Also, the Config is a 0.4.2-SNAPSHOT as of revision "b3ac8d0539d1df60ff3e5daaf5d619411f426f24" on May 24, 2012. The Scala library is from my Scala IDE Eclipse distribution.
Use install
to load the bundles into the OSGi runtime, and then start
them by bundle ID. If you ever have to uninstall a bundle to replace it with a new version, use uninstall
and the bundle ID to remove.
karaf@root> install file:///<path to akka-osgi project root>/lib/org.scala-ide.scala.compiler_2.9.2.v20120330-163119-949a4804e4-vfinal.jar
Bundle ID: 50
karaf@root> install file:///<path to akka-osgi project root>/lib/config-0.4.2-SNAPSHOT.jar
Bundle ID: 51
karaf@root> install file:///<path to akka-osgi project root>/lib/akka-actor-2.1-SNAPSHOT.jar
Bundle ID: 52
karaf@root> install file:///<path to akka-osgi project root>/target/scala-2.9.2/akka-osgi-poc_2.9.2-0.1-SNAPSHOT.jar
Bundle ID: 53
The OSGi context should now look like this:
karaf@root> list
START LEVEL 100 , List Threshold: 50
ID State Blueprint Level Name
[ 50] [Installed ] [ ] [ 80] Scala Library for Eclipse (2.9.2.v20120330-163119-949a4804e4-vfinal)
[ 51] [Installed ] [ ] [ 80] com.typesafe.config (0.4.2.SNAPSHOT)
[ 52] [Installed ] [ ] [ 80] com.typesafe.akka.actor (2.1.0.SNAPSHOT)
[ 53] [Installed ] [ ] [ 80] default.Akka OSGi POC (0.1.0.SNAPSHOT)
Start the bundles and see if the proof of concept works.
karaf@root> start 50
karaf@root> start 51
karaf@root> start 52
karaf@root> start 53
If everything has gone correctly, you will see the following output:
<lots of configuration printed out, but ignore that>
Received 2
Received something else: foo
In this case, an Akka actor is used to start and manage a Karaf container. It does everything the Managed Bundles do, except within the context of another Akka Actor. To see this in action, run the org.jamieallen.osgi.actor.launcher.KarafLauncher source file in Eclipse, IntelliJ, the command line, etc.
Note that using the apache-karaf dependency required resolving several odd transitive dependencies. Four Spring bundles had group IDs that only work if you add a resolver for the repository at Springsource itself to get them. And there is an Eclipse dependency that I only managed to find with a resolver for eBay's open source repo.
If you want to execute this class, please make sure you perform this command first at the project root: sbt update compile osgi-bundle
Results of executing this should show:
ActorMgr about to be started, initializing Karaf framework.
<Lots of configuration output that you can ignore>
Received 2
Received something else: foo
Context started, bundles installed and started:
org.eclipse.osgi_3.6.2.R36x_v20110210 [0]
org.scala-ide.scala.library_2.9.2.v20120330-163119-949a4804e4-vfinal [2]
com.typesafe.config_0.4.2.SNAPSHOT [3]
com.typesafe.akka.actor_2.1.0.SNAPSHOT [4]
default.Akka OSGi POC_0.1.0.SNAPSHOT [5]
Stopping ActorMgr