W-JAX 08 - Declarative Services versus Spring Dynamic Modules
JM 04/09 - OSGi in kleinen Dosen 5
1. Java Core OSGi in kleinen Dosen – Teil 5
Hier wird „Service“
groß geschrieben
Die OSGi Service Platform (OSGi) hat sich zu einem sehr bedeutenden
Standard im Java-Umfeld entwickelt. Also wird es für den engagierten Java-
Entwickler allerhöchste Zeit, sich damit näher auseinander zu setzen.
von Heiko Seeberger
kennen. Heute werden wir zwei weitere
ie ersten drei Artikel dieser Frameworkservices: Package Admin
Standardservices unter die Lupe neh-
Serie (Kasten: „Artikelserie: Service, Start Level Service, (Condi-
men und damit diese Serie abschließen.
OSGi in kleinen Dosen“) über tional) Permission Admin Service und
die technischen Grundlagen von OSGi URL Handlers Service. Diese bieten
Frameworkservices und Service
beleuchteten ausführlich das OSGi- optional eine Erweiterung der Funkti-
Compendium
Framework, das die Basis für Modulari- onalität des OSGi-Frameworks an, z. B.
sierung, Laufzeitdynamik und Services eine Möglichkeit zur Festlegung der
Was ist eigentlich ein OSGi-Standard-
Quellcode in der Java-Welt darstellt. Im letzten Ar- Startreihenfolge von Bundles oder zur
service? Die Antwort auf diese Frage gibt
auf CD tikel lernten wir mit Declarative Services zentralen Verwaltung der Permissions
einen Blick in die OSGi-Spezifikation
bereits einen sehr wichtigen Vertreter von Bundles. Zum anderen nden wir
[1]. Dort nden wir zum einen – in der
der so genannten Standardservices im Service Compendium eine Vielzahl
Core Specification – fünf so genannte
14 javamagazin 4|2009 www.JAXenter.de
2. OSGi in kleinen Dosen – Teil 5 Java Core
Vergleich zu den genannten Lösungen
von Spezi kationen für spezi sche ho-
recht abgespecktes API: Logging-Nach-
rizontale Einsatzbereiche (Kasten: „Ser-
richten können in verschiedenen Levels
vice Compendium“).
geschrieben werden, wobei neben der
Nicht alle dieser Spezifikationen
Nachricht selbst optional ein rowable
sind Services im eigentlichen Sinn, z. B. Abb. 1: Equinox Log Service und Equinox
und/oder eine ServiceReference über-
der bereits im dritten Artikel vorgestellte Console
geben werden können. Letzteres ist die
Service Tracker oder die Initial Provi-
werden. Zunächst fehlen einige Features,
einzige OSGi-spezifische Besonder-
sioning Specification. Des Weiteren
die andere Logging-Lösungen längst
heit, ansonsten fehlen einige der sonst
fällt auf, dass OSGi seine Herkun nicht
bieten, z. B. die Aktivierung von Levels
gewohnten Features, z. B. die Überprü-
leugnen kann: Wir finden zahlreiche
und deren Überprüfung per API oder
fung, ob ein gewisser Level überhaupt
Spezi kationen für den Bereich embed-
die Möglichkeit, den Transport von Log-
„aktiviert“ ist (isDebugEnabled()). Zur
ded/mobile. Wir werden im Folgenden
ging-Nachrichten an LogListener anhand
Nutzung des Log Service wird eine Im-
zwei Standardservices aus dem Service
von Kriterien einzuschrän-
Compendium betrachten,
In der OSGi-Welt bedeutet ken. Aber das eigentliche
die sich insbesondere gut für
Problem besteht darin, dass
den Einsatz im Enterprise-
Logging, dass Nachrichten „echte“ Systeme o zahlrei-
Umfeld eignen.
che Libraries einsetzen, die
dezentral erzeugt werden.
Log Service wiederum eine bestimmte
Logging-Lösung wie Log4j
Kaum ein Softwaresystem
oder SLF4J verwenden und
kommt ohne Logging aus.
eben nicht den OSGi Log Service. Somit
plementierung der Log Service Speci-
Die besondere Herausforderung beim
kann man zwar die Logging-Nachrichten
fication benötigt. Wir verwenden für
Logging in der OSGi-Welt besteht darin,
der eigenen Bundles durch die Verwen-
unser Beispiel die Equinox-Implemen-
dass die Logging-Nachrichten dezentral
tierung, die durch das Bundle org.eclipse. dung des Log Service zentralisieren, je-
– und zwar in den einzelnen Bundles –
equinox.log bereitgestellt wird. Diese doch wird man die Logging-Nachrichten
erzeugt werden, in den meisten Fällen
von „fremden“ Bundles in separaten Ka-
Implementierung bietet eine Integration
jedoch zentral geschrieben werden sol-
nälen nden. Doch gibt es kein Problem
in die Equinox Console: Mit dem Kom-
len, z. B. in eine zentrale Logging-Datei.
mando log können die letzten Logging- ohne Lösung: Die meisten der gängigen
OSGi begegnet dieser Herausforderung
Logging-Lösungen bieten ein Design
Nachrichten angezeigt werden, wobei
mit der Log Service Specification [2].
mit einem API und eine separate Imple-
unter Angabe der Bundle-ID als Para-
Darin wird ein zweigeteiltes API spezi-
mentierung, sodass deren Standardver-
meter die Logging-Nachrichten auf das
ziert: Das Interface LogService dient
entsprechende Bundle eingeschränkt
zum Schreiben von Logging-Nachrich-
ten und das Interface LogReaderService werden können (Abb. 1).
Service Compendium
Da es sich beim Log Service um ei-
bietet die Möglichkeit, geschriebene
Logging-Nachrichten zu lesen oder Log- nen OSGi-Service handelt, gilt es, bei der Log Service
Listener zu registrieren, die die Logging- Benutzung die üblichen Spielregeln zu Http Service
Device Access
berücksichtigen: Der Log Service kann
Nachrichten beim Schreiben erhalten.
Configuration Admin Service
schließlich „kommen und gehen“. Hierfür
Wer schon einmal mit einem der
Metatype Service
bietet sich die Verwendung der im letzten
gängigen Logging-Frameworks wie Preferences Service
Artikel beschriebenen Declarative Servi-
Log4j oder SLF4J gearbeitet hat, wird User Admin Service
mit dem LogService rasch zurecht- ces an. In unserem Beispiel modi zieren Wire Admin Service
IO Connector Service
wir die Shell Component derart, dass sie
kommen. Schließlich bietet er ein im
Initial Provisioning
neben den ContactRepositories auch ei-
UPnP Device Service
nen LogService referenziert (Listing 1). Da Declarative Services
Artikelserie: OSGi in wir diese Referenz „mandatory“ machen, Event Admin Service
wird die Komponente nur aktiv, wenn ein
kleinen Dosen Deplyoment Admin
Auto Configuration
LogService zur Verfügung steht, sodass wir
Teil 1: Erste Schritte mit OSGi Application Admin Service
uns bei dessen Verwendung keine Sorgen
Teil 2: Immer in Bewegung – DMT Admin Service
machen müssen (d. h. die Referenz wird
Bundles und Lifecycle Monitor Admin Service
niemals null sein, Listing 2).
Teil 3: Was wünschen Sie? – Foreign Application Access
Der Log Service meistert zwar die
Services à la OSGi Service Tracker
Teil 4: Services auf deklarative XML Parser Service
eingangs angesprochene Herausforde-
Weise Position
rung, dezentrale Logging-Nachrichten
Teil 5: Hier wird „Service“ groß Measurement and State
zentral zu bündeln, kann aber keineswegs
geschrieben Execution Environment
als alleiniger Heilsbringer bezeichnet
javamagazin 4|2009 15
www.JAXenter.de
3. Java Core OSGi in kleinen Dosen – Teil 5
tierende Verzeichnisstruktur entspricht
Service an. Die Logging-Nachrichten
dank eines speziellen HttpContext, der
werden zentral verarbeitet, egal über
den Servlet Path zu einer Bundle-Res-
welches API sie erzeugt wurden, sodass
source au öst, der Standardstruktur für
eine einheitliche Kon guration und vor
Web-Applications, d. h. die JSPs, Libra-
allem ein zentrales Logging aller Bundles
Abb. 2: HelloServlet à la OSGi ries und TLDs liegen in einem Verzeich-
erzielt werden können.
nis webapp mit Unterverzeichnis WEB-
Http Service INF.
OSGi erobert derzeit, nach der embed-
Fazit
ded/mobile-Welt und dem Desktop,
nun auch den Server. Dazu passend stel- Die beiden exemplarisch vorgestellten
len wir nun den Http Service [4] vor. Die- OSGi-Standardservices zeigen, dass OS-
ser ist in der Standardversion gar nicht Gi nicht nur ein abstraktes dynamisches
so aktuell, schließlich basiert er nur auf Modulsystem für Java bietet, sondern
Version 2.1 des Servlet API und bietet darüber hinaus wichtige Einsatzszena-
auch keine Unterstützung für JavaSer- rien durch horizontale Dienste abdeckt.
Abb. 3: Ausgabe aller Contacts mit
Servlet und JSP
ver Pages. Das Interface HttpService er- Natürlich muss die Spezifikation die
möglicht das Registrieren von statischen Geschwindigkeit des technologischen
Ressourcen und Servlets. Dabei wird Wandels mit aufnehmen, beispielswei-
halten modi ziert werden kann. Eine aus
neben der Ressource oder dem Servlet se beim Versionsstand des Http Service.
unserer Sicht besonders gelungene Lö-
im Wesentlichen ein so genannter Ali- Wer die aktuelle Entwicklung der im
sung dieses „Multi-API-Logging“ bietet
as übergeben, der dem Servlet Path der Sommer dieses Jahres erwarteten nächs-
PAX Logging [3]: Das API Bundle bietet
URL entspricht. Listing 3 zeigt den Aus- ten Version 4.2 verfolgt, wird feststellen,
das API der meisten gängigen Logging-
schnitt einer Service Component, die bei dass sich gerade im Bereich der Enter-
Lösungen einschließlich dem OSGi Log
der Aktivierung unter dem Alias /hello prise-Technologien auch tatsächlich
ein HelloServlet registriert und die Re- eine ganze Menge tut: Transaktionen,
gistrierung bei der Deaktivierung wie- Verteilung und Blueprint Service, auch
Listing 1
der au ebt. Dadurch kann es unter dem bekannt als Spring Dynamic Modules.
<component name=“com.weiglewilczek...shell“>
URL http://localhost:8080/hello (Host Wir dürfen gespannt sein!
<implementation class=“com.weiglewilczek...Component“/>
und Port können natürlich variieren)
<service>
<provide interface=“org.eclipse...CommandProvider“/> aufgerufen werden. In unserem Beispiel
Heiko Seeberger ist als
</service>
resultiert das in einfachem statischem Technical Director für die
<reference name=“contactRepositories“
HTML-Code (Abb. 2). Weigle Wilczek GmbH
interface=“com.weiglewilczek...ContactRepository“
tätig. Sein technischer
Natürlich wird der Http Service in
cardinality=“1..n“/>
Schwerpunkt liegt in der
dieser Standardversion OSGi nicht zum
<reference name=“logService“
Entwicklung von Unterneh-
entscheidenden Durchbruch auf dem
interface=“org.osgi...LogService“ mensanwendungen mit OSGi, Eclipse
Server verhelfen. Dazu fehlen einfach
cardinality=“1..1“/> RCP, Spring, AspectJ und Java EE. Sei-
ne Erfahrungen aus über zehn Jahren
</component> zu viele Features, die von heutigen Web-
IT-Beratung und Softwareentwicklung
Applications vorausgesetzt werden, z. B. fließen in die Eclipse Training Alliance
Servlet Filter und JavaServer Pages. Zum
Listing 2 ein. Zudem ist Heiko Seeberger aktiver
Glück gibt es einige Erweiterungen, die Committer in Eclipse-Projekten, Autor
protected void activate(ComponentContext context) {
zahlreicher Fachartikel und Redner auf
hier aushelfen. So bietet z. B. Equinox
logService = (LogService) context.locateService(“logService“);
einschlägigen Konferenzen.
logService.log(LogService.LOG_INFO, “Activating ...“); neben einer Standardimplementierung
....
auch eine Variante auf Basis von Jetty
und Jasper an, die Servlet API 2.4 und
Links & Literatur
JavaServer Pages 2.0 unterstützt. Noch
Listing 3
aktueller ist derzeit PAX Web [5], eben-
private static final String HELLO = “/hello“; [1] OSGi-Spezifikation:
falls mit gebündeltem Jetty und Support www.osgi.org/Specifications/
protected void activate(ComponentContext context) throws Exception { für Servlet API 2.5 und JavaServer Pages [2] OSGi Service Compendium,
httpService = (HttpService) context.locateService(“httpService“); S. 5ff, Log Service Specification
2.1.
httpService.registerServlet(HELLO, new HelloServlet(), null, null); [3] PAX Logging: wiki.ops4j.org/
In unserem Beispiel verwenden wir
} display/ops4j/Pax+Logging
PAX Web, um gemäß Model-2-Design
[4] OSGi Service Compendium, S. 17
mit einem Servlet die Kontakte aller
protected void deactivate(ComponentContext context) { ff., Http Service Specification
ContactRepositories abzufragen und die-
httpService.unregister(HELLO);
[5] PAX Web: wiki.ops4j.org/display/
se mit einer JSP unter Verwendung von
}
ops4j/Pax+Web
Taglibs anzuzeigen (Abb. 3). Die resul-
16 javamagazin 4|2009 www.JAXenter.de