JM 04/09 - OSGi in kleinen Dosen 5
Upcoming SlideShare
Loading in...5
×
 

JM 04/09 - OSGi in kleinen Dosen 5

on

  • 1,557 views

Fifth article "OSGi in kleinen Dosen" in German Java Magazin 04/09.

Fifth article "OSGi in kleinen Dosen" in German Java Magazin 04/09.

Statistics

Views

Total Views
1,557
Views on SlideShare
1,557
Embed Views
0

Actions

Likes
1
Downloads
27
Comments
0

0 Embeds 0

No embeds

Accessibility

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

JM 04/09 - OSGi in kleinen Dosen 5 JM 04/09 - OSGi in kleinen Dosen 5 Document Transcript

  • 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
  • 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
  • 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