• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Embrace OSGi
 

Embrace OSGi

on

  • 1,875 views

My presentation from ApacheCon Europe 2009 in Amsterdam. It's a introduction into the core concepts of OSGi and provides at the same time usefull information for getting started.

My presentation from ApacheCon Europe 2009 in Amsterdam. It's a introduction into the core concepts of OSGi and provides at the same time usefull information for getting started.

Statistics

Views

Total Views
1,875
Views on SlideShare
1,873
Embed Views
2

Actions

Likes
6
Downloads
100
Comments
0

2 Embeds 2

http://www.slideshare.net 1
http://www.lmodules.com 1

Accessibility

Categories

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

    Embrace OSGi Embrace OSGi Presentation Transcript

    • OSGi Embrace Change A Developer's Quickstart Carsten Ziegeler cziegeler@apache.org
    • About • Member of the ASF – Sling, Felix, Cocoon, Portals, Sanselan, Excalibur, Incubator – PMC: Felix, Portals, Cocoon, Incubator, Excalibur (Chair) • RnD Team at Day Software • Article/Book Author, Technical Reviewer • JSR 286 Spec Group (Portlet API 2.0) 2
    • Agenda 1 Motivation 2 And Action... 3 Why OSGi? 4 Apache Felix 5-7 Bundles, Services, Dynamics 8 Famous Final Words 3
    •  1 Example Application Motivation  4
    • Motivation • Modularity is key – Manage growing complexity – Support dynamic extensibility • No solution in standard Java – OSGi: tried and trusted • Embrace change – Embrace OSGi – Only a few concepts – easy to get started 5
    •  2 Example Action... And Application  6
    • Paint Program • Swing-based paint program • Interface SimpleShape for drawing – Different implementations – Each shape has name and icon properties – Available shapes are displayed in tool bar • Select shape and then select location – Shapes can be dragged, but not resized • Support dynamic deployment of shapes 7
    • Shape Abstraction • Conceptual SimpleShape interface public interface SimpleShape { /** * Method to draw the shape of the service. * @param g2 The graphics object used for * painting. * @param p The position to paint the shape. **/ public void draw(Graphics2D g2, Point p); } 8
    • Paint Program Mock Up 9
    • High-Level Architecture 1 1 1 * Shape Drawing Default Tracker Frame Shape 1 1 1 1 * 1 Shape Simple Component Shape 10
    • High-Level Architecture Best practice – Try to centralize interaction with OSGi API * that so 1 1 1 Shape Drawing componentsDefault other Tracker Frame POJOs...only Shape remain Shape Tracker will 1 1 1 interact with OSGi API. 1 * 1 Shape Simple Component Shape 11
    • High-Level Architecture 1 1 1 * Shape Drawing Default Tracker Frame Shape 1 1 1 1 * 1 Main application window – gets Shape Simple dynamically injected Component Shape with available shapes from the Shape Tracker. 12
    • High-Level Architecture 1 1 1 * Shape Drawing Default Tracker Frame Shape 1 1 1 1 * 1 Shape Simple Actual shape Component Shape implementation. 13
    • High-Level Architecture Injected “proxied” shape 1 1 1 * implementation to hide Shape Drawing Default aspects of dynamism Tracker Frame Shape and provide a default implementation. 1 1 1 1 * 1 Shape Simple Actual shape Component Shape implementation. 14
    • High-Level Architecture Component that draws the shape in parent frame; looks up shape via Drawing 1 1 1 * Shape Drawing Frame Default Tracker Frame Shape rather than having a direct reference. 1 1 1 1 * 1 Shape Simple Component Shape 15
    •  LIVE DEMO Example Application  16
    •  3 Example Application Why OSGi?  17
    • Class Path Hell • Can you spot some potential problems? 18
    • Class Path Hell • What libs are used? Versions? • Which jar is used? Version? • No difference between private and public classes 19
    • Java's Shortcomings • Simplistic version handling – “First” class from class path – JAR files assume backwards compatibility at best • Implicit dependencies – Dependencies are implicit in class path ordering – JAR files add improvements for extensions, but cannot control visibility 20
    • Java's Shortcomings • Split packages by default – Class path approach searches until it finds, which leads to shadowing or version mixing • Limited scoping mechanisms – No module access modifier – Impossible to declare all private stuff as private • Missing module concept – Classes are too fine grained, packages are too simplistic, class loaders are too low level • No deployment/lifecycle support 21
    • Java Dynamism Limitations • Low-level support for dynamics – Class loaders are complicated to use and error prone • Support for dynamics is still purely manual – Must be completely managed by the programmer – Leads to many ad hoc, incompatible solutions • Limited deployment support 22
    • OSGi Technology • Adds modularity and dynamics – Module concept • Explicit sharing (importing and exporting) – Automatic management of code dependencies • Enforces sophisticated consistency rules for class loading – Life-cycle management • Manages dynamic deployment and configuration • Service Registry – Publish/find/bind 23
    •  4 Example Application Apache Felix  24
    • OSGi Alliance • Industry consortium • OSGi Service Platform specification – Framework specification for hosting dynamically downloadable services – Standard service specifications • Several expert groups define the specifications – Core Platform Expert Group (CPEG) – Mobile Expert Group (MEG) – Vehicle Expert Group (VEG) – Enterprise Expert Group (EEG) 25
    • Apache Felix • Top-level project (March 2007) • Healthy and diverse community • OSGi R4 (R4.1) implementation – Framework (frequent releases) – Services (continued development) • Log, Package Admin, Event Admin, Configuration Admin, Declarative Services, Meta Type, Deployment Admin (and more) – Moving towards upcoming R4.2 • Tools – Maven Plugins, Web Console, iPojo 26
    • Apache Felix • Growing community – Several code grants and contributions – Various (Apache) projects use Felix / have expressed interest in Felix and/or OSGi • e.g., ServiceMix, Directory, Sling, Tuscany • Roadmap – Continue toward R4 and R4.1 compliance • some parts consider pre R4.2 already 27
    •  5 Example Application 1 OSGi – Part Bundles  28
    • OSGi Architectural Overview Bundle k or ew ma Fr OSGi Java Operating System Driver Driver Driver Hardware 29
    • OSGi Framework Layering L3 – Provides a publish/find/bind service model to SERVICE MODEL decouple bundles L2 - Manages the life cycle of bundle in a bundle repository without requiring the VM be restarted LIFECYCLE L1 - Creates the concept of modules (aka. bundles) that use classes from each other in a controlled way MODULE according to system and bundle constraints Execution L0 - •OSGi Minimum Execution Environment Environment CDC •CDC/Foundation CDC •JavaSE 30
    • OSGi Framework • Component-oriented framework • Module concept: Bundles – Separate class loader -> graph – Package sharing and version management – Life-cycle management and notification • Dynamic! – Install, update, and uninstall at runtime • Runs multiple applications and services in a single VM 31
    • OSGi Modularity • Explicit code boundaries and dependencies – Package imports and exports • Multi-version support – Version ranges for dependencies • Class space is managed by OSGi • Managed life cycle – Dynamic install, update, uninstall 32
    • OSGi Modularity - Example • Dynamic module deployment and dependency resolution Provided package existing bundle OSGi framework 33
    • OSGi Modularity - Example • Dynamic module deployment and dependency resolution existing bundle install bundle.jar OSGi framework 34
    • OSGi Modularity - Example • Dynamic module deployment and dependency resolution existing resolve bundle bundle OSGi framework 35
    • OSGi Modularity - Example • Dynamic module deployment and dependency resolution automatic package dependency resolution existing bundle OSGi framework 36
    • Creating a Bundle • Plain old JAR with additional metadata in the manifest – Bundle identifier, version, exports, imports • Tools – Text editor (Manifest) – Eclipse (PDE) – Bundle packaging tools • BND from Peter Kriens • Apache Felix maven-bundle-plugin based on BND 37
    • Maven is Your Friend • Apache Felix Maven Bundle Plugin • Creates metadata based on POM – Automatically: import packages – Manually: export and private packages • Analyses classes for consistency • Allows to include dependencies • Creates final bundle JAR file 38
    • Maven Bundle Plugin Sample <artifactId>org.apache.sling.engine</artifactId> <packaging>bundle</packaging> <version>2.0.3-incubator-SNAPSHOT</version> <build> <plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <extensions>true</extensions> <configuration> <instructions> <Export-Package> org.apache.sling.engine;version=${pom.version} </Export-Package> <Private-Package> org.apache.sling.engine.impl </Private-Package> <Embed-Dependency> commons-fileupload </Embed-Dependency> </instructions> 39
    • Maven Bundle Plugin Sample <artifactId>org.apache.sling.engine</artifactId> <packaging>bundle</packaging> <version>2.0.3-incubator-SNAPSHOT</version> <build> <plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <extensions>true</extensions> <configuration> <instructions> <Export-Package> org.apache.sling.engine;version=${pom.version} </Export-Package> <Private-Package> org.apache.sling.engine.impl </Private-Package> <Embed-Dependency> commons-fileupload </Embed-Dependency> </instructions> 40
    • Maven Bundle Plugin Sample <artifactId>org.apache.sling.engine</artifactId> <packaging>bundle</packaging> <version>2.0.3-incubator-SNAPSHOT</version> <build> <plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <extensions>true</extensions> <configuration> <instructions> <Export-Package> org.apache.sling.engine;version=${pom.version} </Export-Package> <Private-Package> org.apache.sling.engine.impl </Private-Package> <Embed-Dependency> commons-fileupload </Embed-Dependency> </instructions> 41
    • Maven Bundle Plugin Sample <artifactId>org.apache.sling.engine</artifactId> <packaging>bundle</packaging> <version>2.0.3-incubator-SNAPSHOT</version> <build> <plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <extensions>true</extensions> <configuration> <instructions> <Export-Package> org.apache.sling.engine;version=${pom.version} </Export-Package> <Private-Package> org.apache.sling.engine.impl </Private-Package> <Embed-Dependency> commons-fileupload </Embed-Dependency> </instructions> 42
    • Be Modular! • Create clean package spaces – public vs private • Provide Bundles – Add manifest information • Think about dependencies – Additional bundle vs include – Optional – Version ranges • Benefits even without OSGi 43
    •  6 Example Application 2 OSGi – Part Services  44
    • OSGi Services (1/3) • Service-oriented architecture – Publish/find/bind – Possible to use modules without services Service Registry Find Publish Service Description Service Service Requester Provider Interact 45
    • OSGi Services (2/3) • An OSGi application is... – A collection of bundles that interact via service interfaces – Bundles may be independently developed and deployed – Bundles and their associated services may appear or disappear at any time • Resulting application follows a Service- Oriented Component Model approach 46
    • OSGi Services (3/3) • Dynamic service lookup Provided service Provided package existing bundle component OSGi framework 47
    • OSGi Services (3/3) • Dynamic service lookup existing bundle install component bundle.jar OSGi framework 48
    • OSGi Services (3/3) • Dynamic service lookup existing activate bundle bundle component OSGi framework 49
    • OSGi Services (3/3) • Dynamic service lookup automatic package dependency resolution existing bundle component OSGi framework 50
    • OSGi Services (3/3) • Dynamic service lookup manual service dependency resolution existing bundle component OSGi framework 51
    • OSGi Services Advantages • Lightweight services – Lookup is based on interface name – Direct method invocation • Good design practice – Separates interface from implementation – Enables reuse, substitutability, loose coupling, and late binding 52
    • OSGi Services Advantages • Dynamic – Loose coupling and late binding • Application's configuration is simply the set of deployed bundles – Deploy only the bundles that you need 53
    • OSGi Services Issues • More sophisticated, but more complicated – Requires a different way of thinking • Things might appear/disappear at any moment – Must manually resolve and track services • There is help – Service Tracker • Still somewhat of a manual approach – Declarative Services, Spring DM, iPOJO • Sophisticated service-oriented component frameworks • Automated dependency injection and more • More modern, POJO-oriented approaches 54
    •  7 Example Application 3 OSGi – Part Dynamics  55
    • Everything is a Bundle • How to structure bundles? – API vs implementation bundle – Fine-grained vs coarse-grained – No “One Size Fits All” • Simple Rules – Stable code vs changing code – Optional parts 56
    • Third Party Libraries • Use as bundles – Project delivers already a bundle • Apache Commons, Apache Sling etc. – Use special bundle repositories • Felix Commons, Spring etc. • But check included metadata! – Create your own wrapper • Easy with the Felix maven bundle plugin • Include in your bundle – Again: easy with the Felix maven bundle plugin 57
    • Everything is Dynamic • Bundles can come and go! – Packages – Services • Services can come and go! • Be prepaired! – Application code must handle dynamics! 58
    • Dynamic Services • OSGi Declarative Services Specification – XML Configuration • Contained in bundle • Manifest entry pointing to config(s) – Publishing services – Consuming services • Policy (static,dynamic), cardinality (0..1, 1..1, 0..n) – Default configuration – Service Lifecycle management • Various Implementations – Apache Felix SCR 59
    • Dynamic Services Configuration <scr:component enabled=quot;truequot; name=quot;org.apache.sling.event.impl.DistributingEventHandlerquot;> <implementation class=quot;org.apache.sling.event.impl.DistributingEventHandlerquot;/> <service servicefactory=quot;falsequot;> <provide interface=quot;org.osgi.service.event.EventHandlerquot;/> </service> <property name=quot;repository.pathquot; value=quot;/var/eventing/distributionquot;/> <property name=quot;cleanup.periodquot; type=quot;Integerquot; value=quot;15quot;/> <reference name=quot;threadPoolquot; interface=quot;org.apache.sling.event.ThreadPoolquot; cardinality=quot;1..1quot; policy=quot;staticquot; bind=quot;bindThreadPoolquot; unbind=quot;unbindThreadPoolquot;/> 60
    • Dynamic Services Configuration <scr:component enabled=quot;truequot; name=quot;org.apache.sling.event.impl.DistributingEventHandlerquot;> <implementation class=quot;org.apache.sling.event.impl.DistributingEventHandlerquot;/> <service servicefactory=quot;falsequot;> <provide interface=quot;org.osgi.service.event.EventHandlerquot;/> </service> <property name=quot;repository.pathquot; value=quot;/var/eventing/distributionquot;/> <property name=quot;cleanup.periodquot; type=quot;Integerquot; value=quot;15quot;/> <reference name=quot;threadPoolquot; interface=quot;org.apache.sling.event.ThreadPoolquot; cardinality=quot;1..1quot; policy=quot;staticquot; bind=quot;bindThreadPoolquot; unbind=quot;unbindThreadPoolquot;/> 61
    • Dynamic Services Configuration <scr:component enabled=quot;truequot; name=quot;org.apache.sling.event.impl.DistributingEventHandlerquot;> <implementation class=quot;org.apache.sling.event.impl.DistributingEventHandlerquot;/> <service servicefactory=quot;falsequot;> <provide interface=quot;org.osgi.service.event.EventHandlerquot;/> </service> <property name=quot;repository.pathquot; value=quot;/var/eventing/distributionquot;/> <property name=quot;cleanup.periodquot; type=quot;Integerquot; value=quot;15quot;/> <reference name=quot;threadPoolquot; interface=quot;org.apache.sling.event.ThreadPoolquot; cardinality=quot;1..1quot; policy=quot;staticquot; bind=quot;bindThreadPoolquot; unbind=quot;unbindThreadPoolquot;/> 62
    • Dynamic Services Configuration <scr:component enabled=quot;truequot; name=quot;org.apache.sling.event.impl.DistributingEventHandlerquot;> <implementation class=quot;org.apache.sling.event.impl.DistributingEventHandlerquot;/> <service servicefactory=quot;falsequot;> <provide interface=quot;org.osgi.service.event.EventHandlerquot;/> </service> <property name=quot;repository.pathquot; value=quot;/var/eventing/distributionquot;/> <property name=quot;cleanup.periodquot; type=quot;Integerquot; value=quot;15quot;/> <reference name=quot;threadPoolquot; interface=quot;org.apache.sling.event.ThreadPoolquot; cardinality=quot;1..1quot; policy=quot;staticquot; bind=quot;bindThreadPoolquot; unbind=quot;unbindThreadPoolquot;/> 63
    • Declarative Services • Reads XML configs on bundle start • Registers services • Keeps track of dependencies – Starts/stops services • Invokes optional activation and deactivation method – Provides access to configuration • Caution: A service is by default only started if someone else uses it! – Immediate flag forces a service start 64
    • Example Service protected ThreadPool threadPool; protected void activate(ComponentContext context) throws Exception { @SuppressWarnings(quot;uncheckedquot;) final Dictionary<String, Object> props = context.getProperties(); this.cleanupPeriod = (Integer)props.get(quot;cleanup.periodquot;); super.activate(context); } protected void bindThreadPool(ThreadPool p) { this.threadPool = p; } protected void unbindThreadPool(ThreadPool p) { if ( this.threadPool == p ) { this.threadPool = null; } } 65
    • Config Admin and Metatype • OSGi Config Admin – Configuration Manager – Persistence storage API to retrieve/update/remove configs – – Works with Declarative Services • OSGi Metatype Service – Description of bundle metadata – Description of service configurations • Various Implementations – Apache Felix 66
    • Maven SCR Plugin • Combines everything (DS, ConfigAdmin, Metatype, Maven) • Annotation-based (works for 1.4+) • Annotate components – Properties with default values – Service providers – Services references (policy and cardinality) • Generates DS XML • Generates Metatype config • Generates Java code 67
    • SCR Plugin Sample /** * @scr.component * @scr.property name=quot;repository.pathquot; value=quot;/var/eventing/distributionquot; private=quot;truequot; * @scr.service interface=quot;EventHandlerquot; */ public class DistributingEventHandler implements EventHandler { protected static final int DEFAULT_CLEANUP_PERIOD = 15; /** @scr.property valueRef=quot;DEFAULT_CLEANUP_PERIODquot; type=quot;Integerquot; */ protected static final String PROP_CLEANUP_PERIOD = quot;cleanup.periodquot;; /** @scr.reference */ protected ThreadPool threadPool; protected void activate(ComponentContext context) throws Exception { final Dictionary<String, Object> props = context.getProperties(); this.cleanupPeriod = (Integer)props.get(PROP_CLEANUP_PERIOD); } 68
    • Alternatives • Manually through bundle activator • Apache Felix iPojo • Spring Dynamic Modules 69
    • Handling extensibility • Two basic implementation strategies – Service-based approach – Extender model 70
    • Service Whiteboard Pattern • Clients register a service interface • Service tracker for registered services • Simple, more robust, leverages the OSGi service model • Service whiteboard pattern – It is an Inversion of Control pattern 71
    • Externder Model • Bundles contain manifest entries – Like available service classes • Custom bundle tracker – Keeps track of bundles – Specifically, STARTED and STOPPED events – Checks bundles manifest data • Creates/removes services 72
    •  8 Example Application Famous Final Words  73
    • Conclusion • Modulary and dynamics are required by todays applications • OSGi technology addresses Java's limitations in these areas – Available today and growing in importance • Development is straightforward and provides immediate benefits • Apache Felix is ready when you are! 74
    • Suggestions for Development • Think about modularity! – Clean package space • Think about dynamics! • Consider OSGi • Check out the spec and other projects • Minimize dependencies to OSGi – but only if it makes sense 75
    • Suggestions for Using OSGi • Think about dynamics – Optional bundles – Optional services – Handle these cases • Use your preferred logging library – LogManager takes care • Use available tooling • Be part of the community! 76
    • Check It Out • Read the OSGi spec – Framework – Config Admin, Metatype, Declarative Services – Deployment Admin, OBR • Download Apache Felix – Try tutorials and samples • Download Apache Sling :) • Explore the web – embrace OSGi 77
    • OSGi Embrace Change Questions?