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

15 Der Event Admin Service270
Schritt 2c: Die Beschreibung der Clock-Komponente
Auch für die Clock-Komponente muss eine Komponentenbeschrei-
bung in Form der Datei
OSGI-INF/component-description.xml angelegt
werden:
<?xml version="1.0"?>
<component name="clockComponent">
<implementation class="org.osgibook.clock.ClockComponent"/>
<property name="event.topics"
value="org/osgibook/timerservice/Timer"/>
<service>
<provide interface="org.osgi.service.event.EventHandler"/>
</service>
</component>
Schritt 3: Ausführen des Beipiels
Um das Beispiel auszuführen, legen Sie zunächst eine neue Launch-
Konfiguration an, die neben den Bundles
org.osgibook.timerservice
und org.osgibook.client aus dem Workspace auch die folgenden
Bundles enthält:
org.eclipse.osgi
org.eclipse.osgi.services
org.eclipse.equinox.event
org.eclipse.equinox.ds
Wenn Sie das Beispiel jetzt starten, sehen Sie, wie das »clock«-Bundle
alle 30 Sekunden die Systemzeit auf der Konsole ausgibt:
osgi> Die aktuelle Zeit: 27.01.2008 11:25.41
Die aktuelle Zeit: 27.01.2008 11:26.11
Die aktuelle Zeit: 27.01.2008 11:26.41
15.2 Der Event Admin Service im Überblick
Der Event Admin Service ermöglicht es Ihnen, über eine standardi-
sierte Schnittstelle Events zwischen unterschiedlichen Bundles auszu-
tauschen. Das Versenden von Events erfolgt dabei über den OSGi Ser-
vice
org.osgi.service.event.EventAdmin, während zum Empfang von
Events OSGi Services vom Typ
org.osgi.service.event.EventHandler
an der Service Registry angemeldet werden müssen (vgl. Abb. 15–3).
Im Gegensatz zum Event-Listener-Pattern, das im JDK Verwen-
dung findet (vgl. dazu auch Unterkapitel 7.6), werden innerhalb des
Event Admin Service spezialisierte Events nicht durch Unterklassen
definiert, sondern durch die Verwendung von Topics und Properties:
Listing 15–4
Die Datei OSGI-
INF/component-
description.xml
27115.3 Die Klasse org.osgi.service.event.Event
Event-Topics: Ein Event-Topic dient der Identifikation eines
Events. Der Name eines Topics wird, ähnlich wie ein Java-Klassen-
name, in einem hierarchischen Namensraum aufgebaut, wobei
jedes Level durch einen Schrägstrich getrennt ist, bspw.
org/
osgibook/timerservice/Timer.
Per Konvention sollten Sie eigene
Topics nach Ihren Packagenamen benennen, um sicherzustellen,
dass die Namen systemweit eindeutig sind.
Event-Properties: Die Event-Properties enthalten weitere Informa-
tionen über das Event. Über die Properties können Sie beliebige
Informationen an die Event-Empfänger verteilen, die den Empfän-
gern eines Events die Möglichkeit geben, nähere Auskunft über das
Event und seine Ursache zu bekommen. Wenn Sie ein Event erstel-
len, nnen Sie selber festlegen, welche Properties Sie verwenden
wollen.
15.3 Die Klasse org.osgi.service.event.Event
Events, die mit dem Event Admin Service verschickt werden, sind
Instanzen der Klasse
org.osgi.service.event.Event (vgl. Listing 15–5).
package org.osgi.service.event;
import java.util.Dictionary;
import org.osgi.framework.Filter;
public class Event {
public Event(String topic, Dictionary properties) {...}
public Object getProperty(String name) {...}
public String[] getPropertyNames() {...}
public String getTopic() {...}
public boolean matches(Filter filter) {...}
}
Abb. 15–3
Funktionsweise des
Event Admin Service
OSGi Framework
publiziert
Events über
versendet
Events über
Event Admin
Service
r
k
EventHandler
E
E
Service
EventHandler
versendet
Events über
Listing 15–5
Die Klasse Event
15 Der Event Admin Service272
15.3.1 Erzeugen von Events
Ein Event-Objekt nnen Sie über den Konstruktor public Event(String
topic, Dictionary properties)
erstellen. Eventspezifische Informationen
fügen Sie dem Event über sein Topic bzw. über dessen Properties hinzu.
Die Angabe von Properties ist optional, wenn Sie keine Properties für
das Event verwenden möchten, können Sie
null übergeben:
Dictionary eventProperties = new Hashtable();
[...]
Event event =
new Event("org/osgibook/timerservice/Timer", eventProperties);
Verwendung von
Properties
Obwohl die API vorsieht, dass Property-Werte beliebige Java-Object-
Instanzen sein können, sollten Sie nur Strings und primitive Java-
Typen (bzw. deren Object-Wrapper) verwenden. Dadurch verhindern
Sie, dass ein Event während seiner Verarbeitung durch einen
Event-
Handler
verändert werden kann. Ansonsten müssten Sie sicherstellen,
dass alle Objekte, die als Property-Werte verwendet werden, immu-
table sind.
15.3.2 Standard-Properties
In der Klasse org.osgi.service.event.EventConstants sind eine Reihe
von Standard-Property-Namen als Konstanten definiert, die in System-
oder eigenen Events Verwendung finden (sollen). Wenn Sie bspw. ein
Event über den Event Admin Service versenden, fügt dieser automa-
tisch den Namen des Event-Topics Ihren Properties hinzu. Der entspre-
chende Property-Key dafür ist in der Konstante
org.osgi.service.
EventConstants.EVENT_TOPIC definiert (Tabelle 15–1).
Konstante in EventCon-
stants
Typ Bedeutung
EVENT_TOPIC String Das Topic des Events
BUNDLE_SIGNER String
Der Name des Signierers
(distinguished name)
BUNDLE_SYMBOLICNAME String Der symbolische Name des für dieses
Event relevanten Bundles
BUNDLE_ID Long Die Bundle-ID des für dieses Event
relevanten Bundles
BUNDLE Bundle Das Bundle-Object des für dieses
Event relevanten Bundles
Tab. 15–1
Standard-Properties
27315.3 Die Klasse org.osgi.service.event.Event
15.3.3 Abfragen eventspezifischer Informationen
Mit den Methoden getTopic(), getPropertyNames() und getProperty()
können Sie nach den verschiedenen Informationen des Events fragen:
Event event = [...]
// Event-Topic ausgeben
System.out.println("event received: " + event.getTopic());
// Alle Properties des Events ausgeben
for (String propertyName : event.getPropertyNames()) {
System.out.println(propertyName + " = " +
event.getProperty(propertyName));
}
Über die Methode matches(Filter filter) können Sie zudem prüfen,
ob das Event einem übergebenen Filter entspricht oder nicht:
Filter filter = bundleContext.createFilter("(" +
EventConstants.EVENT_TOPIC + "=org/osgibook/*)");
if (event.matches(filter)) {
// do something...
}
EVENT Object Das eigentliche Event-Objekt, falls
dieses Event über ein Event aus einem
anderen Event-Mechanismus getrig-
gert wurde
EXCEPTION Throwable Eine für ein Event relevante Exception
EXCEPTION_CLASS String Der Klassenname der Exception
EXCEPTION_MESSAGE String Die Exception-Message
MESSAGE String Eine (menschen-)lesbare Nachricht
SERVICE Service-
Reference
Die Service Reference des für dieses
Event relevanten Service
SERVICE_ID Long Die Service-ID des für dieses Event
relevanten Service
SERVICE_OBJECTCLASS String[] Die Namen der Schnittstellen des für
dieses Event relevanten Service
SERVICE_PID String Die Service-PID
TIMESTAMP Long Der Zeitpunkt, an dem das Event auf-
trat
Konstante in EventCon-
stants
Typ Bedeutung

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