Das OSGi Framework bietet eine universelle, sichere und zentral verwaltete Ausführungsumgebung für modulare Anwendungen (Bundles)

Ähnliche Dokumente
Middleware - Übung. Framework. Security Layer & Module Layer

H OSGi H.2 H.4 H.3. 1 Motivation. 2 Architektur. 2 Architektur (2) Modulsystem/Komponentensystem für Java. OSGi Alliance.

Die OSGi Service Plattform

Laufzeitmanagement von OSGi Applikationen

Laufzeitmanagement von OSGi Applikationen

OSGi mit Apache Felix und IntelliJ IDEA

Gerd Wütherich Martin Lippert. OSGi Service Platform by example

Gerd Wütherich Nils Hartmann. OSGi Service Platform by example

OSGi. The Next Generation Java Service Platform. SOA - The Java Way or My classpath is killing me. Michael Greifeneder

Gerd Wütherich Nils Hartmann Bernd Kolb Matthias Lübken. Einführung in die OSGi Service Platform

Das Interceptor Muster

Andreas Mösching Senior IT Architekt Hewlett-Packard (Schweiz) GmbH HP Banking Service Center Bern

Modulare Anwendungen und die Lookup API. Geertjan Wielenga NetBeans Team Deutschsprachige Überarbeitung, Aljoscha Rittner NetBeans Dream Team

Umstieg auf OSGi - aber wie? Martin Lippert & Matthias Lübken akquinet it-agile

Spring Dynamic Modules for OSGi Service Platforms

Die OSGi Alliance die dynamische Softwareplattform auf Java-Basis. W3L AG

Build Management Tool

Dynamische Plug-ins mit Eclipse 3. Martin Lippert Tammo Freese

Projektgruppe. Thomas Kühne. Komponentenbasiertes Software Engineering mit OSGi

Gerd Wütherich Nils Hartmann Bernd Kolb Matthias Lübken. Einführung in die OSGi Service Platform

Build Management Tool?

Build Management Tool?

Spring Dynamic Modules for OSGi Service Platforms

Software Komponenten. Software Komponenten. Software Komponenten. Software Komponenten

Architektur iterativ auf Basis von OSGi entwickeln

Eine Einführung. Vortragende(r) FU Institut Berlin für Informatik Ingo Mohr

7.1.5 Java RMI Remote Method Invocation ( (

Inhaltsverzeichnis. xil. 1 Einleitung 1. 2 OSGi-TechnologieimOberblick 11. Bibliografische Informationen

Eclipse Equinox als Basis für Smart Client Anwendungen. Christian Campo, compeople AG, Java Forum Stuttgart 2007

Anwendungen zur Raumautomation auf Basis der OSGi- und LON-Technologien

10 Management der OSGi Service Platform

Spring & OSGi: Plattform der Zukunft. Bernd Kolb (Kolbware) Martin Lippert (akquinet agile GmbH) Gerd Wütherich (comdirect bank AG)

Kurzanleitung Eclipse

Handbuch für die Erweiterbarkeit

3.5 Arten von Modulen

Das Build Tool Ant. Sebastian Mancke,

OSGI DECLARATIVE SERVICES

10. OLAPLINE-Anwendertreffen

Die Eclipse Plattform

Kommunikation ist alles

OSGI DECLARATIVE SERVICES

OSGI DECLARATIVE SERVICES

Inhaltsverzeichnis. Bernd Weber, Patrick Baumgartner, Oliver Braun. OSGi für Praktiker

Plug-in-Programmierung mit Eclipse

Internetanwendungstechnik (Übung)

- dynamisches Laden -

Remote Method Invocation

Einstieg in die Informatik mit Java

OSGi-basierte Webapplikationen Ein Erfahrungsbericht

Remote Method Invocation

NetBeans Rich Client Platform. Anton Epple Göttingen, Source Talk Tage

Linux (min. Kernel 2.4) min. Java 1.5 MPJ (

7 Assemblies. Anwendungen (.exe) bzw. Anwendungskomponenten (.dll) für.net Portable Execution (PE) Files

Instrumentierung und Dekodierung

Einstieg in die Informatik mit Java

BRÜHL MÄRZ

Einführung: Verteilte Systeme - Remote Method Invocation -

Theorie zu Übung 8 Implementierung in Java

Eclipse Tomcat Plugin Starthilfe

Entwicklung von Komponenten für Webcenter Content mit Eclipse und Maven. Montag, 12. November 12

Wie ich lernte die API zu lieben. 19. März sic[!]sec GmbH Industriestraße Gröbenzell

Informatik II Übung 06. Benjamin Hepp 5 April 2017

II.4.5 Generische Datentypen - 1 -

Eclipse und EclipseLink

Systemprogrammierung. Projekt: Java RMI. Wintersemester 2006 / 2007

SpringSource Enterprise & Application Platform: Wo geht die Reise hin?

Parallele und Verteilte Systeme

Vorbereitungen Download. AVO-Übung 6. Beispiel. Slice. Varianten u.a. für Linux, Windows, OS X ICE-Dokumentation ICE-Binaries (inkl.

Web-Technologien Kick-Start

AVO Übung 4. AspectIX. 18. Januar 2005 (WS 2004) Andreas I. Schmied Universität Ulm Fakultät für Informatik

Eclipse und Java Einheit 06: Building Eclipse Projete mit Ant

ANT. Kurzvortrag von Manuel Schulze.

Objektorientierte Datenbanken

11. Komponenten Grundlagen der Programmierung 1 (Java)

Seminar. Metamodellierung für modellgetriebene Softwareentwicklung mit MDA und UML

Inhaltsverzeichnis. Grundlagen und Einführung (1. Band) 1

Composing Shops. Modulinstallation und andere coole Composer Features. (auch) für den OXID eshop... und ein bisschen Shopware ;)

Informatik II Übung 1

BVM-Tutorial 2010: BlueBerry A modular, cross-platform, C++ application framework

Eclipse, Spring und OSGi 1

Verbesserung der Architektur der DPP- Software Saros (Vortrag 2) Slawa Belousow Institut für Informatik FU Berlin

Server-Side Eclipse: Mit Eclipse mehr als Rich Clients entwickeln

B Java RMI B.2 B.4. 1 Java. 1.2 Methoden. 1.1 Objekte (2) 1.1 Objekte. Objektorientierte Sprache. Klassenbeschreibung. Methode ist eine Art Funktion

Dateien. DVG Dateien 1

Mini Servlets. Abschlussprojekt Internetprogrammierung. Stefan Wehr. 17. Juli 2006

Oracle & Java HOW TO

Eclipse in der Java-Entwicklung

Einführung OWB Java API

Microsoft.NET Framework & Component Object Model. ein Vortrag von Florian Steuber

CADEMIA: Einrichtung Ihres Computers unter Windows

Installationsanleitung. Apparo Fast Edit. Version 3.1

Installationsanleitung. Apparo Fast Edit. Version 3.0.7

Server-Management mit JMX

Apache JMeter

Mathematik Seminar WS 2003: Simulation und Bildanalyse mit Java. Software-Architektur basierend auf dem Plug-in-Konzept

Transkript:

J.1 OSGi J.1 OSGi OSGi (Open Services Gateway initiative) Standardisierte, komponentenorientierte Softwareplattform Entspricht dem SOA-Paradigma (Service Oriented Architecture) OSGi Service Platform setzt auf der Java Virtual Machine auf Spezifikation OSGi Service Platform Release 1 (2000), aktuell Release 4.1 (2007) Beschreibt lediglich API und Testcases OSGi-Frameworks Equinox Framework von Eclipse (http://www.eclipse.org/equinox/) Apache Felix (ehemals Oscar) (http://felix.apache.org/) Knopflerfish (Open Source / Gatespace) (http://www.knopflerfish.org/) Diverse kommerzielle Produkte J.1 Das OSGi Framework bietet eine universelle, sichere und zentral verwaltete Ausführungsumgebung für modulare Anwendungen (Bundles) Framework-Aufbau Bundle 1 Bundle 2 Bundle n C/C++ JNI OSGi Framework Services Service Registry Life Cycle Modules Java Runtime Environment Operating System / Hardware Security J.2

1 Framework Security Layer Bundles können aus verschiedenen Quellen stammen Infrastruktur für eine kontrollierte Ausführung (controlled environment), basierend auf der Java 2 Security Architecture. [1] Code Authentifizierung durch Signaturen (Herkunft, Unterzeichner) Securtity Layer ist optional und oft nicht implementiert Module Layer Einheit der Modularisierung: Bundle Bundles werden als Java ARchive (JAR) Datei ausgeliefert Sie enthalten: Alle für den Dienst notwendigen Resourcen (inkl. weiterer JARs) Eigenen Class-Path und Loader (Policy) Bundlebeschreibung und Abhängigkeiten (z.b. Java Packages) in Manifest Datei (META_INF/MANIFEST.MF) J.3 1 Framework Life Cycle Layer Verwaltung des Lebenszyklus von Bundles Bundles können installiert, gestartet, gestoppt und deinstalliert werden Zusätzlich können Bundles zur Laufzeit aktualisiert und überwacht werden install INSTALLED update refresh STARTING resolve refresh update start uninstall RESOLVED uninstall UNINSTALLED ACTIVE STOPPING stop J.4

1 Framework Life Cycle Layer - Entitäten: Bundle - Repräsentiert ein installiertes Bundle Bundle Context - Ausführungskontext eines Bundles Zugriff auf Informationen des Framework und die Service Registry Installieren anderer Bundles Wird beim starten/stoppen an Bundle Activator weitergereicht Bundle Activator - Interface implementiert durch eine Klasse des Bundles Starten und stoppen des Bundles Bundle Event - Signalisiert Lebenszyklus Zustandsänderungen Framework Event - Signalisiert Framework Zustandsänderungen Bunde/Framework Listener - Listener für Events Bundle Exception - Ausnahme für Framework-Operationen System Bundle - Bundle-Repräsentation des Frameworks J.5 1 Framework Service Layer Service Registry zum registrieren, finden und binden von Diensten Dienste sind Java-Objekte (Service Object), registriert mit ihrem/ihren Interface(s) (Service Interface) Bundles können Dienste registrieren, suchen und ihren Zustand abfragen Mit dem stoppen des Bundles werden alle registrierten Dienste entfernt Service Layer - Entitäten: Service - Registrierter Dienst in der Service Registry, das Service Object gehört zu und läuft in einem Bundle Service Registry - Verwaltet die Dienste Service Reference - Referenz auf einen Dienst Zugriff auf Diensteigenschaften (auf Service Object über Bundle Context) Service Registration - Rückgabe der Registrierung, erlaubt aktualisieren und entfernen des Dienstes J.6

1 Framework Service Layer - Entitäten (Forts.): Service Factory - Ermöglicht es dem Anbieter, das Service Object auf den Nutzer anzupassen Service Event - Informationen über Registrierung, Änderung und Deregistrierung von Service Objects Service Listener - Listener für Service Events Filter - Objekt für die Auswahl über Diensteigenschaften J.7 2 Felix OSGi Framework Apache Top-Level-Projekt (http://felix.apache.org) Aktuelle Release: Felix 1.0.1 Installation: Download und entpacken Felix starten und testen: ulbrich@faui48a:/local/felix$ java -jar bin/felix.jar Welcome to Felix. ================= Enter profile name: integration_test DEBUG: WIRE: 31.0 -> org.osgi.service.packageadmin -> 0... DEBUG: WIRE: 33.0 -> org.apache.felix.shell -> 31.0 -> J.8

2 Felix OSGi Framework Felix Shell: -> help bundlelevel <level> <id>... <id> - set or get bundle start level cd [<base-url>] - change or display base URL headers [<id>...] - display bundle header properties help - display impl commands install <URL> [<URL>...] - install bundle(s) obr help - OSGi bundle repository packages [<id>...] - list exported packages ps [-l -s -u] - list installed bundles refresh [<id>...] - refresh packages resolve [<id>...] - attempt to resolve specified bundle services [-u] [-a] [<id>...] - list registered or used services shutdown - shutdown framework start <id> [<id> <URL>...] - start bundle(s) startlevel [<level>] - get or set framework start level stop <id> [<id>...] - stop bundle(s) uninstall <id> [<id>...] - uninstall bundle(s) update <id> [<URL>] - update bundle version - display version of framework -> J.9 2 Felix OSGi Framework Konfigurationsdateien von Felix conf/system.properties und conf/config.properties Bundles können über config.properties konfiguriert werden Zugriff über BundleContext.getProperty() Alternative Standorte: java -Dfelix.system.properties=file:/local/felix/conf/system.properties bzw. java -Dfelix.config.properties=file:/local/felix/conf/config.properties Einige Parameter: felix.auto.install - Bundles die automatisch installiert werden sollen felix.auto.start - Bundles die automatisch gestartet werden sollen felix.cache.dir - Verzeichnis des Bundle-Cache (default ~/.felix/) felix.cache.profile - Name des Profiles (innerhalb des Bundle-Cache) Integration in Eclipse siehe: http://felix.apache.org/ J.10

2 Felix OSGi Framework Life Cycle - Manuelles installieren und starten eines Bundles: -> install file:bundle/simple.jar Bundle ID: 10 -> ps START LEVEL 1 ID State Level Name [ 0] [Active ] [ 0] System Bundle (1.1.0.SNAPSHOT)... [ 10] [Installed ] [ 1] Simple Bundle (1.0.0) -> start 10 Simple bundle 10 has started. From native: Hello! -> Stoppen, aktualisieren und deinstallieren von Bundles analog Achtung: Bei Abhängigkeiten evtl. ein refresh notwendig J.11 J.3 Manifest J.3 Manifest Beschreibt das Bundle und seine Abhängigkeiten Notwendige Parameter: Manifest-Version - Manifest Spezifikation (1.0) Bundle-Name - Name des Bundles Import-Package - Von anderen Bundles importierte Pakete (zwingend notwendig ist org.osgi.framework) Wichtige Parameter: Bundle-Activator - Klasse die das Interface BundleActivator implementiert, andernfalls dient das Bundle nur als Bibliothek Bundle-SymbolicName - Eindeutiger Name (meist in Domain-Form) Export-Package - Pakete die von diesem Bundle exportiert werden Bundle-Version - Version Bundle-Classpath - Intra-Bundle Classpath für eingebettete JARs Require-Bundle - Importiert alle Pakete der angegebenen Bundles J.12

1 Manifest J.3 Manifest Activator Klasse ist "main" des Bundles und wird beim starten ausgeführt Jedes Bundle hat eigenen Classloader und Class Space Classpath ergibt sich aus: RTE + Framwork + Bundle Classpath Beispiel (META-INF/manifest.mf) Manifest-Version: 1.0 Bundle-Name: simplebundle Bundle-SymbolicName: gruppe0.osgi.simplebunde Bundle-Version: 1.0.0 Bunde-Description: Demo Bundle Bunde-Activator: gruppe0.osgi.simplebundle.impl.activator Import-Package: org.osgi.framework Auf korrekte Formatierung achten! Bezeichern : Wert / Listen kommasepariert / Umbruch mit Leerzeichen einrücken / Zeilenumbruch am Ende der Datei J.13 2 Auflösen der Abhängigkeiten J.3 Manifest Auflösen der Abhängikeiten (Resolving) zwischen Bundles Verdrahten von Importeuren und Expoteuren anhand von Bedingungen Die Bedingungen werden statisch definiert, durch: Importierte und exportierte Pakete Benötigte Bundles (import aller Pakete) Fragmente (Teil eines größeren logischen Bundles) Ein Bundle kann aufgelöst werden wenn Alle Importe sind verdrahtet Alle benötigten Pakete sind verfügbar und ihre Exporte verdrahtet Nach dem Auflösen kann Bundle geladen und ausgeführt werden J.14

J.4 Build file J.4 Build file Bauen eines OSGi Bundles Übersetzen der Quellen Packen aller Resourcen und des Manifestes zu einem JAR Beispiel für ein Ant build.xml: <?xml version="1.0"?> <project name="simplebundle" default="all"> <target name="all" depends="compile,jar"/> <target name="compile"> <javac destdir = "./classes" srcdir = "./src"></javac> </target> <target name="jar"> <jar basedir = "./classes" jarfile = "./build/simplebundle.jar" includes = "**/*" manifest = "./meta-inf/manifest.mf" /> </target> </project> J.15 Die Aktivator Klasse implementiert BundleActivator Interface Beispiel: public class Activator implements BundleActivator { public static BundleContext bc = null; public void start(bundlecontext bc) throws Exception { System.out.println("stopping..."); Activator.bc = bc; public void stop(bundlecontext bc) throws Exception { System.out.println("stopping..."); Activator.bc = null; Methoden start() und stop()müssen implementiert werden BundleContext sollte mit starten gesetzt und mit stoppen gelöscht werden In start() wird das Bundle hochgefahren (z.b. Threads gestartet) In stop() muss alles wieder aufgeräumt werden J.16

1 Dienste anbieten Erweiterung des Bundles um einen Dienst Bundle erhält ein Interface (Service Interface) für den Dienst Das Manifest wird erweitert Manifest Erweiterung: Export-Package: gruppe0.osgi.simpleservice; version="1.0.0" Dienst Interface: package gruppe0.osgi.simpleservice; import java.util.date; public interface SimpleService { public String getformatteddate(date date); Dienst Implementierung (Service Implementation) analog J.17 1 Dienste anbieten Aktivator registriert den Dienst BundleContext.registerService( SInt, SImpl, Param<K:V> ); ServiceRegistration zur Verwaltung der Registrierung Beispiel: public class Activator implements BundleActivator { public static BundleContext bc = null; public void start(bundlecontext bc) throws Exception { System.out.println("starting..."); Activator.bc = bc; SimpleService service = new SimpleServiceImpl(); ServiceRegistration registration =bc.registerservice( SimpleService.class.getName(),service, new Hashtable()); public void stop(bundlecontext bc) throws Exception { System.out.println("stopping..."); Activator.bc = null; J.18

2 Dienste nutzen Manifest für die Nutzung eines Dienstes: Manifest-Version: 1.0 Bundle-Name: serviceuser Bundle-SymbolicName: gruppe0.osgi.serviceuser Bundle-Version: 1.0.0 Bunde-Description: Demo Bundle Bunde-Activator: gruppe0.osgi.serviceuser.impl.activator Import-Package: org.osgi.framework, gruppe0.osgi.simpleservice Anforderung eines Dienstes BundleContext.getServiceReference( ServiceInterface ); BundleContext.getService( ServiceReference ); Framework erlaubt dynamisches installieren, aktualisieren und löschen ServiceReference müss daher immer überprüft werden Die ServiceReference nach Verwendung schnell wieder freigeben J.19 2 Dienste nutzen Beispiel: import gruppe0.osgi.simpleservice; public class Activator implements BundleActivator { public static BundleContext bc = null; public void start(bundlecontext bc) throws Exception { Activator.bc = bc; ServiceReference reference = bc.getservicereference (SimpleService.class.getName()); if (reference!= null) { SimpleService service = (SimpleService)bc.getService(reference); System.out.println( service.getformatteddate(new Date())); bc.ungetservice(reference); else { System.out.println("Service unavailable!!"); public void stop(bundlecontext bc) throws Exception { Activator.bc = null; J.20

2 Dienste nutzen Dynamisches binden von Diensten Problem mit erstem Ansatz falls Dienst beim Start nicht verfügbar Lösung: Regelmäßig prüfen oder ServiceListener ServiceEvent und Filter nutzen Ein Filter ist ein LDAP ähnlicher String über den Events gefiltert werden Um den Filter erweiterte start()methode des Aktivators: public void start(bundlecontext bc) throws Exception { Activator.bc = bc; String filter = "(objectclass="+simpleservice.class.getname()+")"; bc.addservicelistener(this, filter); ServiceReference references[] = bc.getservicereferences (null, filter); for (int i = 0; references!= null && i < references.length; i++) { this.servicechanged( new ServiceEvent(ServiceEvent.REGISTERED,references[i])); J.21 2 Dienste nutzen Der Aktivator erhält das ServiceListener Interface Zusätzliche Methode servicechanged(serviceevent event) Hilfsmethoden (z.b. stopusingservice()/startusingservice()) Beispiel: public void servicechanged(serviceevent event) { switch (event.gettype()) { case ServiceEvent.REGISTERED: this.service = (SimpleService) Activator.bc.getService( event.getservicereference()); this.startusingservice(); break; case ServiceEvent.MODIFIED: this.stopusingservice(); this.service = (SimpleService) Activator.bc.getService( event.getservicereference()); this.startusingservice(); break; case ServiceEvent.UNREGISTERING: this.stopusingservice(); break; J.22

2 Dienste nutzen Dienste können mit Eigenschaften registriert werden Zusätzliche Beschreibung des Dienstes Ermöglicht "best fit" Auswahl bei mehreren Dienstanbietern Beispiel - Dienstanbieter: Hashtable properties = new Hashtable(); properties.put("color", Boolean.FALSE); properties.put("a3paper", Boolean.TRUE); bundlecontext.registerservice( "inf4.laserjet", new Laserjet(), properties); Beispiel - Dienstnutzer: ServiceReference[] srefs = bundlecontext.getservicereferences( "inf4.laserjet", "(A3paper=true),(color=false)"); J.23 J.6 Classloading J.6 Classloading Jedes Bundle besitzt einen eigenen Classloader Dadurch verfügt jedes Bundle über eigenen Namespace Bundle-ClassPath (Manifest) beschreibt intra Bundle Classpath Suchreihenfolge Lade Klasse XYZ JAVA.*? Java Runtime Paket? Beauftrage Parent-Classloader! boot delegation? importiert? Classpath? Enthalten in org.osgi.framework.bootdelegation? Beauftrage Parent-Classloader! Importiert durch Import-Package? Beauftrage entfernten Bundle-Classloader! Im Bundle Classpath? Beauftrage eigenen Bundle-Classloader! J.24

1 Classloading J.6 Classloading Kann zu nicht offensichtlichen Effekten führen System-Classloader kann Klasse laden, wird aber ggf. wegen Regelwerk nicht "weitergereicht". Framework Konfiguration bestimmt welche Klassen exportiert werden Trickreiches Beispiel: Klasse XYZ wird durch zwei Classloader C1 und C2 geladen XYZ C1 ist nicht gleich XYZ C2!! Kein Cast möglich: Unterschiedliche Typen! Classloader halten Referenzen Auf alle geladenen Klassen (Selbst nach uninstall) Framework refresh J.25 J.7 Stale reference J.7 Stale reference In OSGi kann der Besitzer eines Objektes "verschwinden" "Abgestandene" Referenzen: Referenz auf ein Objekt wobei dessen Classloader bzw. Bundle gestoppt wurde dessen Dienst unregistriert wurde Beispiel: Bundle A nutzt Service von Bundle B A hält eine Referenz - erhalten z.b. über den Dienst - auf Objekt O der Klasse K, geladen durch B s Classloader Wird Bundle B gestoppt ist Referenz auf O Stale Reference Problematik: Klassen eines gestoppten Bundles können nicht vom Garbage Collector eingesammelt werden Problemen beim aktualisieren J.26

J.8 Hinweise zu Aufgabe 7 J.8 Hinweise zu Aufgabe 7 MW-Library Server aus Aufgabe 4 als OSGi Bundle Modularisierung von Sever und Datenbank Zwei Bundles: Server und Database Vorgaben Felix OSGi Framework: /local/felix Konfiguration: /proj/i4mw/pub/aufgabe7 Konfiguration von Felix Classloading der Standard Java Klassen J.27 J.8 Literatur J.8 Hinweise zu Aufgabe 7 [1] : Java Security Architecture http://java.sun.com/j2se/1.5.0/docs/guide/security/spec/security-spec.doc1.html J.28