O'Reilly logo

Die OSGi Service Platform: Eine Einführung mit Eclipse Equinox by Matthias Lübken, Bernd Kolb, Nils Hartmann, Gerd Wütherich

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

20 Der Application Admin Service346
protected void unlockSpecific() {
locked = false;
refreshServiceProperties();
}
Hashtable<String, Object> getServiceProperties() {
Hashtable<String, Object> properties =
new Hashtable<String, Object>();
properties.put(APPLICATION_NAME, executable.getName());
properties.put(APPLICATION_VISIBLE, "true");
properties.put(APPLICATION_LAUNCHABLE,
isLaunchableSpecific());
properties.put(APPLICATION_LOCKED, locked);
properties.put(APPLICATION_CONTAINER,
"org.osgibook.externalapplication.container");
properties.put("service.pid", getApplicationId());
return properties;
}
private void refreshServiceProperties() {
if (descriptorServiceRegistration != null) {
descriptorServiceRegistration.setProperties(
getServiceProperties());
}
}
File getExecutable() {
return this.executable;
}
public void shutdown() throws Exception {
ServiceReference[] references =
bundleContext.getServiceReferences(
ApplicationHandle.class.getName(),
"(&(application.state=RUNNING)(application.descriptor="
+ getApplicationId() + "))");
if (references != null) {
for (ServiceReference reference : references) {
ApplicationHandle handle =
(ApplicationHandle) bundleContext
.getService(reference);
if (handle != null) {
System.out.println("Stoppe Instanz " +
handle.getInstanceId());
handle.destroy();
}
}
}
}
}
34720.1 Tutorial: Externe Anwendungen starten
Schritt 4: Implementierung des registerApp-Kommandos
In diesem Schritt implementieren wir das registerApp-Kommando,
dem Sie den Namen einer externen Anwendung übergeben. Für diese
Anwendung wird dann ein Application Descriptor instanziert und an
der Service Registry angemeldet. Um die Anwendungen beim Stoppen
des Bundles beenden zu können, merken wir uns außerdem eine Refe-
renz auf jeden erstellen Application Descriptor.
Eine registrierte Anwendung können Sie zur Laufzeit über das
Kommando
startApp, das Bestandteil der Equinox-Application-
Admin-Service-Implementierung ist, ausführen.
Das
registerApp-Kommando implementieren wir der Einfachheit
halber in der Activator-Klasse unseres »application«-Bundles, das wir
zu einem Command Provider machen. Bitte erweitern Sie also die
bestehende Activator-Klasse:
package org.osgibook.application;
[...]
import org.osgi.service.application.ApplicationDescriptor;
public class Activator implements BundleActivator, CommandProvider
{
private BundleContext bundleContext;
private List<ExternalApplicationDescriptor> descriptors =
new LinkedList<ExternalApplicationDescriptor>();
public void start(BundleContext context) throws Exception {
bundleContext = context;
context.registerService(CommandProvider.class.getName(),
this, null);
}
public void _registerApp(CommandInterpreter commandInterpreter){
String command = commandInterpreter.nextArgument();
File executable = new File(command);
String applicationId = executable.getName();
commandInterpreter.println("Registriere Anwendung " +
applicationId);
ExternalApplicationDescriptor descriptor = new
ExternalApplicationDescriptor(bundleContext,
applicationId, executable);
bundleContext.registerService(
ApplicationDescriptor.class.getName(),
descriptor, descriptor.getServiceProperties());
descriptors.add(descriptor);
}
Listing 20–3
Die Activator-Klasse
20 Der Application Admin Service348
public void stop(BundleContext context) throws Exception {
for (ExternalApplicationDescriptor descriptor : descriptors){
descriptor.shutdown();
}
}
public String getHelp() {
return "registerApp <command> - Registriert die " +
"angegebene Anwendung. Das command muss ausfuehrbar sein";
}
}
Schritt 5: Starten des »Notepad«
Wir haben nun alle erforderlichen Teile unseres Tutorials implemen-
tiert, so dass Sie jetzt in der Lage sind, externe Anwendungen aus Ihrer
OSGi Platform heraus auszuführen.
Starten Sie das Beispiel bitte mit einer neuen Launch-Konfigura-
tion, über die Sie neben dem »application«-Bundle aus Ihrem Work-
space auch folgende Bundles aus der Target Platform starten:
org.eclipse.equinox.app
org.eclipse.equinox.common
org.eclipse.equinox.registry
org.eclipse.osgi
org.eclipse.osgi.services
Registrieren Sie dann die Anwendung »notepad.exe« über die
Equinox-Konsole mit dem
registerApp-Kommando. Mit dem apps-
Kommando zeigt Ihnen der Application Admin Service eine Liste aller
bekannten Anwendungen:
osgi> registerApp notepad.exe
Registriere Anwendung notepad.exe
osgi> apps
notepad.exe [launchable]
Starten Sie nun mit dem startApp-Kommando das Notepad. Mit stop-
App können Sie es anschließend über die Konsole wieder beenden:
osgi> startApp notepad.exe
Executing command: notepad.exe
Launched application instance: notepad.exe:0
osgi> apps
notepad.exe [running] [launchable]
osgi> stopApp notepad.exe
Stopped application instance: notepad.exe:0
34920.2 Der Application Admin Service im Überblick
Damit haben Sie gesehen, wie Sie über den Application Admin Service
eine Anwendung registrieren, starten und stoppen können. Im Folgen-
den werden wir Ihnen die Details dieses Service erläutern, so dass Sie in
der Lage sein werden, auch für eigene Anwendungen oder Anwen-
dungstypen Implementierungen der benötigten Klassen zu erstellen.
20.2 Der Application Admin Service im Überblick
Mithilfe des Application Admin Service können aus der OSGi Service
Platform heraus Anwendungen beliebigen Typs administriert werden.
Die Application-Admin-Service-Spezifikation definiert dazu keinen
»zentralen« Service zum Starten und Stoppen von Anwendungen. Viel-
mehr beschreibt er zwei verschiedene Rollen, die Bundles einnehmen
können, die den Application Admin Service verwenden möchten, um
Anwendungen zu verwalten (vgl. Abb. 20–3):
Der Application Container: Ein Application Container stellt eine
Laufzeitumgebung für einen oder mehrere Anwendungstypen (z.B.
externe Anwendungen wie in unserem Tutorial) zur Verfügung. Ein
Application Container muss einen Application Descriptor imple-
mentieren und an der Service Registry anmelden. Der Descriptor
gibt Auskunft über die Anwendung, z.B. deren Name und ob sie
gerade startbar ist. Außerdem muss ein Application Container
einen Application Handle implementieren, der eine laufende
Instanz einer Anwendung beschreibt. Der Application Handle
muss zur Laufzeit der Anwendung an der Service Registry als Ser-
vice angemeldet werden.
OSGi Framework
Management
Bundle
Mana
g
ement
Management
Agent
Application
Manager
Application
Descriptor /
Handle
A
pp
licatio
n
Application
Descriptor /
Handle
A
pp
D
e
s
Han
Ap
p
D
e
s
H
a
n
Application Container
Application Container
Abb. 20–3
Der Application Admin
Service

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required