Gerd W�therich Martin Lippert OSGi Service Platform by example Die OSGi Service Platform � Das Buch � Detaillierte Einf�hrung in OSGi-Technologie � April 2008, dpunkt.verlag � ISBN 978-3-89864-457-0 � Website: www.osgibook.org � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Agenda � OSGi-Technologie im �berblick � OSGi-Technologie im Detail � � � � Bundles Package-Abh�ngigkeiten zwischen Bundles Bundle-Lebenszyklus OSGi Services � Zusammenfassung � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Wir erinnern uns... � � � � Kein OO Kein Information Hiding Nur globale Variablen ... � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Und heute... � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License JAR-Hell bcel rt jce jsse plugin marketing spring asm content naming core commons guiapp hibernate cglib oracle dbcp aspectjrt logging poi lucene jdom utils json log4j axis resource � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Was fehlt uns? � Gr�bere Einheiten � Mehr als Klassen oder Packages � Klare Abh�ngigkeiten � zwischen den Einheiten/Modulen � Klare Sichtbarkeiten � Zwischen den Einheiten/Modulen � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License OSG � was? � Die OSGi Service Platform... � ... ist ein dynamisches Modulsystem f�r Java. � ... erm�glicht die dynamische Integration und das Management von Softwarekomponenten (Bundles) und Diensten (Services). � Bundles und Services k�nnen zur Laufzeit in der Plattform installiert, gestartet, gestoppt und deinstalliert werden. � Besteht aus: � OSGi Framework (Container f�r Bundles und Services) � OSGi Standard Services (verschiedene, horizontale Services) � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Das OSGi Framework � Basiskomponente der OSGi Service Platform � Erlaubt die Installation und Verwaltung von Bundles und Services � Verwaltet Anh�ngigkeiten zwischen Bundles � Kann �ber Management Agents ,,von au�en" administriert werden � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Welche Vorteile bietet die OSGi Service Platform? Modularisierung und Versionierung Abh�ngigkeitsmanagement (zur Laufzeit) Hot deployment (Fern-) Management des laufenden Frameworks �ber sog. Management Agents � Serviceorientiertes Programmiermodell � � � � SOA-Konfusion: � Web Services publizieren und nutzen Dienste �ber das Netz � OSGi Services publizieren und nutzen Dienste innerhalb einer virtuellen Maschine � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Wo wird die OSGi Service Platform eingesetzt? Einige Beispiele: � Eclipse Platform � Eclipse SDKs (IDEs), RCP, eRCP, ... � IBM � Websphere App Server (basiert auf OSGi) � Lotus (basiert auf Eclipse-RCP, damit auch OSGi) � Jazz (basiert auf Server-Side-Eclipse) � � � � BEA/Oracle SpringSource Application Platform / dm Server Adobe ... � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Implementierungen der OSGi Service Platform � Open Source Implementierungen: � � � � Eclipse Equinox (http://www.eclipse.org/equinox/) Apache Felix (http://cwiki.apache.org/FELIX/index.html) Knopflerfish (http://www.knopflerfish.org/) ProSyst mBedded Server Equinox Edition (http://www.prosyst.com/products/osgi_se_equi_ed.html) � Kommerzielle Implementierungen: � ProSyst (http://www.prosyst.com) � Knopflerfish Pro (http://www.makewave.com) � ... � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License OSGi-Demo: Sherlog - Log-File-Analyser � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Bundles � ... sind die Modularisierungseinheiten innnerhalb des OSGi Frameworks � ... enthalten zusammengeh�rige Klassen und Ressourcen � ... k�nnen unabh�ngig im OSGi Framework deployed werden � ... sind JAR-Dateien � ... enthalten ein Bundle Manifest, das das Bundle beschreibt � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Das Bundle Manifest � ... ist Teil des Bundles in der Datei META-INF/MANIFEST.MF � ... enth�lt Informationen, die das Bundle beschreiben, z.B. � den eindeutigen Namen und die Version � die �ffentliche Schnittstelle/API � Package-Abh�ngigkeiten Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Histogram Bundle Bundle-SymbolicName: org.javakontor.sherlog.ui.histogram Bundle-Version: 1.0.0 Bundle-Activator: org.javakontor.sherlog.ui.histogram.Activator Import-Package: org.osgi.framework;version="1.4.0" Bundle-ClassPath: . � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Bundle Aktivierung � Jedes Bundle kann im Bundle-Manifest einen BundleAktivator definieren Bundle-Activator: org.javakontor. ... .Activator � Der Bundle-Aktivator muss das Interface BundleActivator implementieren package org.osgi.framework; public interface BundleActivator { public void start(BundleContext context) throws Exception; public void stop(BundleContext context) throws Exception; } � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Demo 1: Ein Histogram-Bundle � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Package-Abh�ngigkeiten � Package-Abh�ngigkeiten m�ssen explizit angegeben werden: � Packages m�ssen exportiert werden, um sichtbar f�r andere Bundles zu sein. � Packages m�ssen importiert werden, um im Bundle genutzt werden zu k�nnen. � Das OSGi Framework ist verantwortlich f�r das Aufl�sen der importierten und exportierten Packages. � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Packages exportieren � Nur die �ffentliche API ist f�r andere Bundles sichtbar � Manifest-Header "Export-Package": kommaseparierte Auflistung aller exportierten Packages Export-Package: org.jfree.data.statistics, ... � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Importieren von Packages mit Import-Package � Der Manifest-Header "Import-Package" gibt PackageAbh�ngigkeiten an � Importierte Packages werden durch Komma getrennt aufgelistet Import-Package: org.jfree.data.statistics � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Packages importieren mit Require-Bundle � Referenziert ein bestimmtes Bundle � Bundles werden durch Komma getrennt aufgef�hrt Require-Bundle: org.free.chart � Alle exportierten Packages der ben�tigten Bundles werden vom Bundle importiert � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Demo 2: Package Dependencies � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Der Bundle Lifecycle � Bundles haben einen definierten Lebenszyklus � Zustands�nderungen k�nnen programmatisch oder durch einen Management Agent getriggert werden � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Installieren von Bundles I � Das Bundle wird (persistent) im OSGi Framework verf�gbar gemacht � Der Bundle-Zustand wird auf INSTALLED gesetzt � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Installieren von Bundles � Ein Bundle im Zustand INSTALLED kann (noch) nicht genutzt werden: � Das Bundle kann nicht gestartet werden � Packages werden nicht exportiert � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Resolving � Importierten Packages werden exportierte Packages zugeordnet � Ist dies erfolgreich, wird der Zustand wird auf RESOLVED gesetzt � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Resolving � Ein Bundle im Zustand RESOLVED kann gestartet werden � Exportierte Packages k�nnen von anderen Bundes importiert werden � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Starten von Bundles � Das Bundle wird in den Zustand STARTING gesetzt � Der Bundle-Aktivator wird instantiiert und die start()Methode aufgerufen � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Stoppen von Bundles � Das Bundle wird in den Zustand STOPPING gesetzt � Falls ein Aktivator deklariert ist, wird BundleActivator.stop() aufgerufen � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Deinstallieren von Bundles � Entfernt Bundles aus dem OSGi Framework � Das Bunde wird in den Zustand UNINSTALLED gesetzt � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Demo 3: Bundle-Lebenszyklus � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License OSGi Services Ein OSGi Service... � ...ist ein einfaches Java-Objekt (POJO), � ...wird an der zentralen Service Registry registriert, � ...kann von der zentralen Service Registry abgefragt werden. � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Services registrieren � Registrieren �ber den BundleContext: public class Activator implements BundleActivator { public void start(BundleContextcontext) throws Exception{ context.registerService(ViewContribution.class.getName(), newHistogramViewContribution(), null); [...] } [...] } � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Services benutzen � Abfragen �ber den BundleContext: ServiceReference serviceReference = context .getServiceReference(LogEventStore.class.getName()); if(serviceReference!= null) { LogEventStore logEventStore= (LogEventStore) context.getService(serviceReference); if(logEventStore!= null) { [...] } } � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Demo 4: OSGi Services � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Services k�nnen kommen und gehen � Die Suche nach einem Service kann scheitern, weil ... � ... das implementierende Bundle noch nicht gestartet ist � ... der Service noch nicht registriert ist � ... das implementierende Bundle beendet wurde � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License ServiceListener / ServiceTracker � ServiceListener / ServiceTracker � ServiceListener: Callbacks, wenn sich etwas �ndert � ServiceTracker: Verfolgen von Service Listener Events (weniger Code als bei der direkten Verwendung von Service Listenern) � Empfehlung: Benutzen Sie ServiceTracker! � (Besser: Verwenden Sie deklarative Ans�tze!) � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Service Tracker I public class LogEventStoreServiceTracker extends ServiceTracker { public LogEventStoreServiceTracker(BundleContext context) { super(context, LogEventStore.class.getName(), null); } public Object addingService(ServiceReference reference) { LogEventStore logEventStore = (LogEventStore) super.addingService(reference); // do something here... return logEventStore; } public void removedService(ServiceReference reference, Object service) { // do something here... super.removedService(reference, service); } } � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Service Tracker II public class Activator implements BundleActivator { private ServiceTracker _serviceTracker; public void start(BundleContext context) throws Exception { _serviceTracker = new LogEventStoreServiceTracker(context); _serviceTracker.open(); } public void stop(BundleContext context) throws Exception { _serviceTracker.close(); } } � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Demo 5: Dynamic services � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Deklarative Ans�tze � Declarative Services � � � Teil der OSGi-Spezifikation Deklarative Beschreibung von Services mit XML Kapitel 12 in "Die OSGi Service Platform" � Spring Dynamic Modules � � � � � � � � � Spring wird mittels OSGi dynamisch http://www.springframework.org/osgi Blueprint Service in OSGi Specification R 4.2 "Original" DI framework for OSGi http://ipojo.org Guice: Performantes, leichtgewichtiges DI Framework Peaberry: Erweiterung zu Guice f�r OSGi http://code.google.com/p/peaberry/ http://code.google.com/p/google-guice/ � iPojo � Guice - Peaberry � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License Vielen Dank! Fragen? � Gerd W�therich, Martin Lippert; Licensed under Creative Commons Attribution-Noncommercial-Share Alike 3.0 Germany License