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

201
12 Declarative Services
Motivation
Das OSGi Framework implementiert ein Service-Modell, in dem Ser-
vices programmatisch an der Service Registry angemeldet und abge-
fragt werden. Dieses Modell ist sehr mächtig, besitzt jedoch bei der
Konstruktion großer Anwendungssysteme einige Nachteile:
Startup-Dauer: Das Service-Modell erfordert, dass Services instan-
ziert und aktiv registriert werden, was in der Regel beim Start des
implementierenden Bundles erfolgt. In Systemen mit vielen Bundles
kann dies schnell zu einer inakzeptablen Startup-Dauer führen.
Speicherverbrauch: Für jeden Service, der im Framework regist-
riert wird, werden alle zugehörigen Klassen und Objekte in den
Speicher geladen. Falls der Service niemals genutzt wird, ist dieser
Speicherplatz unnötigerweise belegt.
Komplexität: Da Services jederzeit kommen und gehen können, ist
das resultierende Programmiermodell deutlich komplexer als her-
kömmliche Modelle.
Die Declarative Service Specification adressiert diese Probleme durch
die Einführung von Service Components. Die von einer Service Com-
ponent bereitgestellten und benötigten Services werden deklarativ
beschrieben. Die sog. Service Component Runtime aktiviert eine Ser-
vice Component nur, wenn alle benötigten Services im System verfüg-
bar sind. Die von einer Service Component bereitgestellten Services
können verzögert aktiviert werden, d.h., sie werden erst dann erzeugt,
wenn ein nutzendes Bundle auf diese Services zugreift.
Einordnung
Die Konzept hinter den deklarativen Services wurde von Hum-
berto Cervantes und Richard S. Hall in der »Service Binder«-Biblio-
thek [SERBIN] entwickelt. Seit der Version R4 ist eine Weiterentwick-
lung dieser Bibliothek unter dem Namen »Declarative Services«
Bestandteil des OSGi Service Compendium sowie der OSGi Mobile
Specification und ist dort jeweils in Kapitel 112 »Declarative Services
Specification« definiert.
12 Declarative Services202
12.1 Tutorial: Services deklarativ beschreiben
Überblick
Im Tutorial zu diesem Kapitel stellen wir das Beispiel aus Kapitel 8 auf
deklarative Services um (Basis für dieses Tutorial ist damit der End-
stand aus Kapitel 8). Den Umbau nehmen wir in zwei Schritten vor:
Schritt 1 Umstellung des Bundles org.osgibook.translation.impl:
Die Implementierung des Translation Service realisieren wir als
Service Component, über die der Translation Service bereitgestellt
wird.
Schritt 2 – Umstellung des Bundles org.osgibook.helloworld: Auch
im Bundle org.osgibook.helloworld realisieren wir eine Service
Component, bei deren Aktivierung und Deaktivierung ein Gruß
ausgegeben werden soll.
In Abb. 12–1 sind die beteiligten Bundles mit ihren Abhängigkeiten
dargestellt.
Abb. 12–1
Übersicht über die
beteiligten Bundles
META-INF
MANIFEST.MF
org.osgibook.translation
TranslationService
META-INF
MANIFEST.MF
translation_de_DE.properties
component-description.xml
OSGI-INF
org.osgibook.helloworld
MANIFEST.MF
META-INF
META-INF
MANIFEST.MF
org.osgibook.translation.impl
OSGI-INF
component-description.xml
verwendet
Klassen aus
verwendet
Service
OSGi Service Platform /
Declarative Services
20312.1 Tutorial: Services deklarativ beschreiben
Die Plug-in-Projekte
Die fertigen Plug-in-Projekte zu diesem Tutorial sind in Abb. 12–2 dar-
gestellt.
Die Implementierung der Declarative Services ist in Eclipse Equinox 3.3 nicht
Bestandteil der Standard-Distribution, sondern muss zusätzlich aus dem
Equinox Incubator in Form des Bundles
org.eclipse.equinox.ds_<ver-
sion>.jar
heruntergeladen werden (vgl. Abschnitt 1.4.3).
Mitte 2007 hat die Firma Prosyst der Eclipse Community verschiedene
Standard-Service-Implementierungen als Open Source übergeben, unter
anderem auch eine Implementierung der Declarativce Services. Es ist
geplant, dass diese Implementierung die bestehende Implementierung ersetzt
und voraussichtlich Bestandteil von Eclipse Equinox 3.4 wird.
Abb. 12–2
Die Plug-in-Projekte
Achtung
12 Declarative Services204
Schritt 1a: Entfernen des »TranslationServiceImpl«-Bundle-Activators
Da das Erzeugen und Registrieren der Translation-Service-Implemen-
tierung in Form einer Service Component erfolgen soll, wird die Acti-
vator-Klasse, die diese Aufgabe bislang erledigt hat, nicht mehr benö-
tigt. Entfernen Sie deshalb die Klasse
org.osgibook.translation.
internal.Activator
aus dem Plug-in-Projekt und den entsprechenden
Manifest Header
Bundle-Activator im Bundle Manifest.
Schritt 1b: Beschreibung der Translation Service Component
Damit die Translation Service Component von der Service Component
Runtime erzeugt und aktiviert werden kann, müssen Sie die Kompo-
nente in Form eines XML-Dokumentes beschreiben. Dazu müssen Sie
deren Pfad innerhalb des Bundles im Bundle Manifest mit dem Mani-
fest Header
Service-Component spezifieren:
Service-Component: OSGI-INF/component-description.xml
Anschließend legen Sie die Datei OSGI-INF/component-description.xml
mit dem in Listing 12–1 dargestellten Inhalt an:
<?xml version="1.0"?>
<component name="translationServiceComponent">
<implementation class="org.osgibook.translation.impl.
TranslationServiceImpl"/>
<property name="translation.language" value="de"/>
<property name="translation.country" value="DE"/>
<service>
<provide interface="org.osgibook.translation.
TranslationService"/>
</service>
</component>
Schritt 1c: Anpassen der Klasse TranslationServiceImpl
Damit die Klasse TranslationServiceImpl von der Service Component
Runtime instanziert werden kann, müssen Sie einige Anpassungen vor-
nehmen. Zum einen benötigt die Klasse einen Default-Konstruktor,
damit entsprechende Exemplare via Reflection erzeugt werden n-
nen. Zum anderen müssen Sie die Callback-Methode
activate() imp-
lementieren, die bei der Aktivierung der Komponente aufgerufen wird
und in der wir das Locale des Translation Service setzen.
Das folgende Listing 12–2 zeigt die Implementierung der Klasse
TranslationServiceImpl:
Listing 12–1
OSGI-INF/component-
description.xml
20512.1 Tutorial: Services deklarativ beschreiben
package org.osgibook.translation.impl;
[...]
import org.osgi.service.component.ComponentContext;
public class TranslationServiceImpl implements TranslationService {
private ResourceBundle translations;
public String getTranslation(String key) {
try {
return translations.getString(key);
} catch (MissingResourceException e) {
return key;
}
}
protected void activate(ComponentContext componentContext) {
Dictionary properties = componentContext.getProperties();
String language =
(String) properties.get("translation.language");
String country =
(String) properties.get("translation.country");
Locale locale = new Locale(language, country);
translations = ResourceBundle.
getBundle("translation", locale);
}
}
Beachten Sie, dass Sie das Package org.osgi.service.component im
Bundle Manifest importieren müssen, damit die Klasse
org.osgi.
service.component.ComponentContext
innerhalb des Bundles genutzt wer-
den kann:
Import-Package: org.osgi.framework;version="1.4.0",
org.osgi.service.component;version="1.0.0",
org.osgibook.translation
Schritt 2a: Entfernen des Bundle-Activators
Im Bundle org.osgibook.helloworld wird innerhalb des Beispiels aus
Kapitel 8 der Gruß beim Start und beim Stopp des Bundles ausgege-
ben. Die Ausgabe ist dabei im Aktivator des Bundles implementiert. In
diesem Tutorial wird dieser Aktivator nicht mehr benötigt, da wir eine
Service Component implementieren, die den entsprechenden Gruß
ausgibt. Entfernen Sie deshalb im »Hello World«-Plug-in-Projekt die
Klasse
org.osgibook.helloworld.Activator und den Bundle-Activator-
Header im Bundle Manifest.
Listing 12–2
Die Klasse
TranslationServiceImpl

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