6 OSGi Services98
Schritt 4: Ausführen der Launch-Konfiguration
Wenn Sie nun die Launch-Konfiguration ausführen, erhalten Sie die
gleiche Ausgabe wie im Beispiel des vorherigen Kapitels:
osgi> Hallo OSGi-Welt sagt Bundle org.osgibook.helloworld!
Damit haben Sie Ihren ersten Service an der OSGi Service Registry
angemeldet und abgefragt. In den nachfolgenden Unterkapiteln wer-
den wir Ihnen die demonstrierten Techniken im Detail vorstellen.
6.2 OSGi Services im Überblick
OSGi Services
Ein OSGi Service ist ein einfaches Java-Objekt, das an einer zentrale
Registratur (der Service Registry) unter einem oder mehreren Inter-
face- oder Klassennamen angemeldet wird. Dort kann es von anderen
Bundles, die den Service nutzen möchten, über den bei der Anmeldung
angegebenen Namen abgefragt und verwendet werden.
Prinzipiell können Sie jedes beliebige Java-Objekt als OSGi Service
bereitstellen. Es ist bspw. durchaus möglich, ein Exemplar vom Typ
Long (z.B. new Long(1)) unter dem Klassennamen java.lang.Long an der
Service Registry anzumelden. Für gewöhnlich sollte jedoch ein OSGi
Service unter den Namen eines Interface (dem Service Interface) regis-
triert werden, das die öffentlichen Methoden des Service definiert.
Arbeiten mit
OSGi Services
Beim Arbeiten mit Services sind folgende Schritte notwendig (vgl.
Abb. 6–5):
Abb. 6–5
Arbeiten mit der
Service Registry
Service Registry
3. Service
verwenden
1. Service registrieren 2. Service abfragen
4. Service freigeben5. Service deregistrieren
MANIFEST.MF
META-INF
org.osgibook.helloworld
META-INF
MANIFEST.MF
org.osgibook.translation.impl
org.osgibook.translation
TranslationService
996.3 OSGi Services registrieren und deregistrieren
Schritt 1 Services registrieren: Damit ein OSGi Service im System
verfügbar wird, muss er innerhalb eines Bundles erzeugt und an der
Service Registry registriert werden.
Schritt 2 – Services abfragen: Die an der Service Registry angemel-
deten Services nnen anschließend unter den bei der Registrie-
rung angegebenen Klassennamen abgefragt werden.
Schritt 3 – Services verwenden: Wenn ein Bundle einen Service von
der Service Registry erhalten hat, dann hat das Bundle einen direk-
ten Zugriff auf das als Service angemeldete Objekt und kann des-
sen Funktionalität in Anspruch nehmen.
Schritt 4 Services freigeben: Wird ein Service von einem nutzen-
den Bundle nicht mehr benötigt, dann muss dieses durch das
Bundle explizit freigegeben werden. Das OSGi Framework kann so
explizit verwalten, welche Services von welchen Bundles genutzt
werden.
Schritt 5 – Services deregistrieren: Wenn ein Service nicht mehr im
System zur Verfügung stehen soll, dann muss er durch das Bundle,
das den Service angemeldet hat, explizit deregistriert werden. Wird
das anmeldende Bundle gestoppt, dann werden alle angemeldeten
Services automatisch deregistriert. Nach der Deregistrierung eines
Service steht diese nicht mehr an der Service Registry zur Verfü-
gung.
6.3 OSGi Services registrieren und deregistrieren
6.3.1 Registrieren von OSGi Services
Das Registrieren eines Objektes als OSGi Service erfolgt über eine der
beiden
registerService()-Methoden des BundleContext:
package org.osgi.framework;
[...]
public interface BundleContext {
[...]
public ServiceRegistration registerService(String clazz,
Object service, Dictionary properties);
public ServiceRegistration registerService(String[] clazzes,
Object service, Dictionary properties);
[...]
}
Listing 6–3
Serviceregistrierung über
den Bundle Context
6 OSGi Services100
Beide Methoden erwarten als Parameter das zu registrierende Service-
Objekt sowie ein (optionales) Dictionary mit Properties, die den Ser-
vice her beschreiben. Zusätzlich muss der Name einer oder mehrerer
Klassen (bzw. Interfaces) angegeben werden, unter denen der Service
später an der Service Registry abgefragt werden kann. Wir werden das
Arbeiten mit Properties explizit in Unterkapitel 6.6 behandeln. Wenn
Sie keine Properties setzen möchten, können Sie an dieser Stelle auch
null übergeben.
Beachten Sie zudem, dass das Registrieren von Services nur mög-
lich ist, wenn sich das Bundle in einem der Zustände
STARTING oder
ACTIVE befindet.
Beispiel
Der folgende Aufruf registriert den Translation Service aus dem
»Translation«-Bundle an der Service Registry:
public void start(BundleContext context) throws Exception {
TranslationService service = new
TranslationServiceImpl(Locale.getDefault());
ServiceRegistration registration =
context.registerService(TranslationService.class.getName(),
service, null);
}
Service Registration
Als Ergebnis der Registrierung liefern beide Methoden ein Objekt vom
Typ
ServiceRegistration zurück (vgl. Listing 6–4).
package org.osgi.framework;
public interface ServiceRegistration {
public ServiceReference getReference();
public void setProperties(Dictionary properties);
public void unregister();
}
Die Service Registration ist für die private Benutzung innerhalb des
anmeldenden Bundles gedacht und sollte anderen Bundles nicht
zugänglich gemacht werden. Über die Service Registration können Sie
die für einen Service gesetzten Properties nachträglich verändern.
Zudem ist die Service Registration die einzige Möglichkeit, einen Ser-
vice manuell zu deregistrieren, falls dieser nicht mehr zur Verfügung
stehen soll.
Listing 6–4
Das Interface
ServiceRegistration

Get Die OSGi Service Platform: Eine Einführung mit Eclipse Equinox now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.