incubator-s4-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Leo Neumeyer (Commented) (JIRA)" <>
Subject [jira] [Commented] (S4-4) Dynamic App Loading
Date Tue, 18 Oct 2011 17:07:10 GMT


Leo Neumeyer commented on S4-4:

My notes from today's discussion:

- Matthieu will look at app loading

- Our problem is constrained because the entry point is always a class of type App. All interaction
with the app is via the App methods: ini,t start, close, etc and the APi only uses known framework
classes: Event, EventSource, etc.)

- Each will have its own classloader to make it easy to release and GC.

- we will test using Matthieu's forked node unit tests to validate

- create a separate minimal project as template for creating apps. Requirement: output should
be a single JAR file (we could call it S4R: HelloApp.s4r to indicate that it has valid s4
attributes in the manifest).

- The S4R file is dropped in a dir. Server will load/unload based on what files are in the

- Loaded apps are tracked by Server. Apps must must have a unique ID. Here is an idea: S4R
includes properties to identify app: for example: 

S4-App-Description: An app to count words.
S4-App-OwnerId: 79f0eea01c

Server (or ZK) will assign a unique ID (0,1,2,...). Server will map AppIDs to AppModules.
An AppModule has a reference to the loaded app, the S4-App- properties, deployment time, and
any other administrative info. In this way we can always identify the loaded app and guarantee
that there are unique IDs in the cluster.

- No app to app communication in first milestone.

For later:
- Test app to app communication using EventSource.
- Coordinate load/unload using ZK and a deployment server. 
- Restrict loaded App so they cannot execute System.exit(), they cannot create threads, etc.
- Test app loading by creating lots of apps and releasing them, memory should not grow indefinitely
and we can probably track that apps get garbage collected.
- what happens if jar in app is diff than framework jar. It should use its own jar without
interfering with system jar.

> Dynamic App Loading
> -------------------
>                 Key: S4-4
>                 URL:
>             Project: Apache S4
>          Issue Type: New Feature
>            Reporter: Leo Neumeyer
> We want to be able to load and unload applications dynamically. Here is some background
> Once a server is started, we expect it to run indefinitely until there is a failure or
we need to upgrade the framework software or we change the cluster configuration. In S4, the
cluster is symmetric, that is, all the nodes are identical, with the same code base and the
same configuration.
> Applications are loaded dynamically after the cluster is started. If app1 depends on
app2, then app2 needs to use an EventSource to publish events. Apps must be able to find EventSource
and subscribe to it during initialization.
> When an app is unloaded, it will close its EventSource(s). This in turn, will close all
the streams that are subscribed. The apps that own the streams are responsible for taking
action once their dependencies are gone.
> Possible roadmap:
> M1:
> - Server starts with no apps.
> - Apps are loaded during initialization, for example by searching an
> app directory.
> - Apps are initialized (no dependencies among apps).
> - Apps are started.
> M2:
> - Add dependencies among apps using EventSource.
> M3:
> - Add runtime loading/unloading functionality
> Leo implemented a solution using JBOSS Modules which seems simpler than using OSGI. Modules
seems to work but is not well documented which makes it hard to use without understanding
the low level details. See the commented out code here:
> From Adam:
> Yes I have a few ideas but I need couple days to implement them.
> First, is to build S4 and examples as proper OSGi bundles using gradle osgi plugin
> Its using bnd tool
> Then embed osgi container (using standard osgi api)  in Controller instead of JBoss modules
> and configure directory from which felix should auto deploy our examples
For dynamic deployment we can use file install bundle,
it will watch directory from which it loads new bundles.
> To configure properly examples we can use ipojo
or declarative services,
they both using service component model and are not intrusive in the code.
> That will be enough to load properly the apps.
> Later we have to think how we want to use osgi in s4, just to load apps or properly use
service management. Bundles are hiding the internals from other bundles and should communicate
through well defined services. And also I don't have clear picture how s4 is going to be distributed
(have to look more at Maybe you can write me some small description
of s4 concept.
> ...
> I've implemented ideas which I sent you before. Now I can load the apps using embedded
osgi container but there is still class loading issue (com.esotericsoftware.kryo.SerializationException:
Unable to find class: io.s4.example.counter.UserEvent). To be able to run s4 I had to put
plenty system packages in configuration file for felix. 
> Around 15 jars defined in libraries are not osgi bundles (don't have proper manifest
file). The biggest issue are dependencies and classloading (for example Kryo is trying to
load UserEvent class but that class is not visible for him so Class.forName is not going to
work).I will try to fix these problems, in the meantime you can have a look at my repo
I added task createRepo, it will create bundles directory with all dependencies and project
jars. When you launch Main class from s4-core, it launches embedded felix which will auto
deploy all bundles located in bundles directory. In the console you will see felix gogo shell
( ).
> From Henry:
> Ugh, I was actually trying to avoid OSGI if I can =)

This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:!default.jspa
For more information on JIRA, see:


View raw message