Apache Felix. Richard S. Hall. A Standard Plugin Model for Apache. Atlanta, Georgia U.S.A. November 13th, 2007

Similar documents
Carsten Ziegeler

Introduction to OSGi. Marcel Offermans. luminis

JSR 277, 291 and OSGi, Oh My! - OSGi and Java Modularity

Java Modularity Support in OSGi R4. Richard S. Hall ApacheCon (San Diego) December 14 th, 2005

OSGi in Action. Ada Diaconescu

Modular Java Applications with Spring, dm Server and OSGi

Using Apache Felix: OSGi best practices. Marcel Offermans luminis

Patterns and Best Practices for Dynamic OSGi Applications

Patterns and Best Practices for dynamic OSGi Applications

Equinox OSGi: Pervasive Componentization

OSGi in Action. RICHARD S. HALL KARL PAULS STUART McCULLOCH DAVID SAVAGE CREATING MODULAR APPLICATIONS IN JAVA MANNING. Greenwich (74 w. long.

Agenda. Why OSGi. What is OSGi. How OSGi Works. Apache projects related to OSGi Progress Software Corporation. All rights reserved.

OSGi. Building and Managing Pluggable Applications

OSGi on the Server. Martin Lippert (it-agile GmbH)

1.2. Name(s) and address of Document Author(s)/Supplier: Sahoo: 1.3. Date of This Document: 12 July 2008

Building Secure OSGi Applications. Karl Pauls Marcel Offermans. luminis

Modularity for Java and How OSGi Can Help

Dependencies, dependencies, dependencies

Tuscany: Applying OSGi modularity after the fact

Managing Installations and Provisioning of OSGi Applications. Carsten Ziegeler

Java Platform, Enterprise Edition 6 with Extensible GlassFish Application Server v3

Peter Kriens OSGi Evangelist/Director. OSGi R4.3 // Next Release Overview

Christopher Frost Virgo Committer Martin Lippert Lead, Spring Development Tools SpringSource, a division of VMware 3rd November 2011

Breaking Apart the Monolith with Modularity and Microservices CON3127

Liberate your components with OSGi services

Spring Dynamic Modules

Apache Felix Shell. Apache Felix Shell. Overview. How the Shell Service Works. package org.apache.felix.shell;

Fast Track to Spring 3 and Spring MVC / Web Flow

OSGi Best Practices. Emily

Jigsaw and OSGi: What the Heck Happens Now?

Developing Java Applications with OSGi Capital District Java Developers Network. Michael P. Redlich March 20, 2008

Lab 1 Introduction ipojo Component Model

SAP Edge Services, cloud edition Edge Services Predictive Analytics Service Guide Version 1803

The Definitive Guide to. NetBeans Platform 7. Heiko Bock. Apress*

OSGi. Tales from the Trenches. OSGitales from the trenches

Europe on a Disk Geodata Processing with Eclipse and OSGi. Harald Wellmann 10 Nov 2008

Modular Java EE in the cloud

Class Dependency Analyzer CDA Developer Guide

Create your own Carbon Component. Sameera Jayasoma Technical Lead and Product Manager of WSO2 Carbon

Socket attaches to a Ratchet. 2) Bridge Decouple an abstraction from its implementation so that the two can vary independently.

Extensibility, Componentization, and Infrastructure

Copyright Oracle Corporation and VMware Inc, Enterprise Modules Project (Gemini) Proposal

Sonatype CLM Enforcement Points - Nexus. Sonatype CLM Enforcement Points - Nexus

AJDT: Getting started with Aspect-Oriented Programming in Eclipse

BEAWebLogic. Event Server. WebLogic Event Server Reference

Is OSGi Modularity Always Worth It? Glyn Normington

Using the Bridge Design Pattern for OSGi Service Update

04 Webservices. Web APIs REST Coulouris. Roy Fielding, Aphrodite, chp.9. Chp 5/6

OSGi. Building LinkedIn's Next Generation Architecture with OSGI

Spring Interview Questions

Building LinkedIn's Next Generation Architecture with OSGI

GlassFish V3. Jerome Dochez. Sun Microsystems, Inc. hk2.dev.java.net, glassfish.dev.java.net. Session ID YOUR LOGO HERE

Tattletale. What is Tattletale? Enterprise archives JBoss Application Server 7 Putting it all together Roadmap

MARS AREA SCHOOL DISTRICT Curriculum TECHNOLOGY EDUCATION

Enterprise Development

ATC An OSGI-based Semantic Information Broker for Smart Environments. Paolo Azzoni Research Project Manager

Red Hat JBoss Fuse 6.1

Selenium Testing Course Content

Liferay Digital Experience Platform. New Features Summary

Comparing JavaBeans and OSGi

Powered by. These slides are powered by Open Source softwares : Debian GNU Linux Beamer LaTeX mode LaTeX Emacs. Context. Last night OSGi saved my life

SPRING MOCK TEST SPRING MOCK TEST I

Under the Paul Fremantle, CTO, WSO2

SOA-14: Continuous Integration in SOA Projects Andreas Gies

IBM Rational Software

OSGi & Spring combined

Equinox Framework: How to get Hooked

JOnES. Gaël Blondelle CTO and co-founder. Context. JBI: Java Business Integration The Java standard for integration solutions assembly

CS486: Tutorial on SOC, OSGi, and Knopflerfish. Ryan Babbitt (props to Dr. Hen-I Yang, CS415X) Feb. 3, 2011

Demystifying OSGi bundles Excerpted from

Core Capabilities Part 3

What s new in IBM Operational Decision Manager 8.9 Standard Edition

Technical Debt in Eclipse Development. Eclipse Con France 2018

Active Endpoints. ActiveVOS Platform Architecture Active Endpoints

Spring and OSGi. Martin Lippert akquinet agile GmbH Bernd Kolb Gerd Wütherich

MAVEN INTERVIEW QUESTIONS

eclipse rich ajax platform (rap)

Enterprise Java Development using JPA, Hibernate and Spring. Srini Penchikala Detroit JUG Developer Day Conference November 14, 2009

Index. Decomposability, 13 Deep reflection, 136 Dependency hell, 19 --describe-module, 39

wcm.io Context-Aware Configuration

Software Components and Distributed Systems

7. Component Models. Distributed Systems Prof. Dr. Alexander Schill

The UniversAAL Platform

JBI based ESB as backbone for SOI applications. Michael Wisler Zühlke Engineering AG Submission ID: 687

Using JBI for Service-Oriented Integration (SOI)

How-to use ipojo factories

First Steps in RCP. Jan Blankenhorn, WeigleWilczek GmbH, Stuttgart, Germany. February 19th, 2009

Open ESB v2, Open ESB.next and Project Fuji. Andreas Egloff Lead Architect SOA / Business Integration Sun Microsystems

Spring & Hibernate. Knowledge of database. And basic Knowledge of web application development. Module 1: Spring Basics

USAS-R. Status, Current Design & Implications Technical. Fall OEDSA Dave Smith; SSDT

Apache Felix Framework Launching and Embedding

OSGi Application Development using GlassFish Server. Version 1.0

Java J Course Outline

Adapting JDT to the Cloud. Alex Boyko Pivotal Jay Arthanareeswaran - IBM John Arthorne - IBM

Understanding ClassLoaders WebSphere 5.1, 6.0 and 6.1

Perceptive Connect Runtime

Equinox Project Update

Leverage Rational Application Developer v8 to develop OSGi application and test with Websphere Application Server v8

The State of Apache Sling

Pelix/iPOPO When Python gets a taste of OSGi

Transcription:

Apache Felix A Standard Plugin Model for Apache Richard S. Hall Atlanta, Georgia U.S.A. November 13th, 2007

Agenda Why OSGi technology? OSGi technology overview Apache Felix status Example application OSGi application approaches Example application demo Advanced approaches Conclusion

Why OSGi Technology? (Addressing Java's Limitations)

Motivation (1/2) Growing complexity requires not only highly modular code, but also systems that are dynamically extensible This is true no matter which problem domain is your area of concern Embedded systems need to adapt to changing requirements even though they are deployed out in the field Client applications must respond to user desires for new functionality instantaneously Server applications must be configurable and manageable without down time

Motivation (2/2) Java provides the mechanisms to do these things, but they are Low level Error prone Ad hoc Java's shortcoming are particular evident in its support for both modularity and dynamism

Java Modularity Limitations (1/2) Limited scoping mechanisms No module access modifier Simplistic version handling Class path is first version found 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

Java Modularity Limitations (2/2) Split packages by default Class path approach searches until it finds, which leads to shadowing or version mixing JAR files can provide sealing Unsophisticated consistency model Cuts across previous issues, it is difficult to ensure class space consistency Missing module concept Classes are too fine grained, packages are too simplistic, class loaders are too low level No deployment support

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 No deployment support

OSGi Technology Resolves many deficiencies associated with standard Java support for modularity and dynamism Defines a module concept Explicit sharing of code (i.e., importing and exporting) Automatic management of code dependencies Enforces sophisticated consistency rules for class loading Code life cycle management Manages dynamic deployment and configuration

OSGi Technology Overview

OSGi Alliance Industry consortium Defines OSGi Service Platform 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)

OSGi Architectural Overview Bundle OSGi Java Operating System Framework Driver Driver Driver Hardware

OSGi Framework (1/2) Component-oriented framework Bundles (i.e., modules/components) Package sharing and version management Life-cycle management and notification Service-oriented architecture Publish/find/bind intra-vm service model Open remote management architecture No prescribed policy or protocol

OSGi Framework (2/2) Runs multiple applications and services Single VM instance Separate class loader per bundle Class loader graph Independent namespaces Class sharing at the Java package level Java Permissions to secure framework Explicitly considers dynamic scenarios Run-time install, update, and uninstall of bundles

OSGi Framework Layering SERVICE MODEL L3 Provides a publish/find/bind service model to decouple bundles LIFECYCLE L2 - Manages the lifecycle of bundle in a bundle repository without requiring the VM be restarted MODULE Execution Environment CDC CDC L1 - Creates the concept of modules (aka. bundles) that use classes from each other in a controlled way according to system and bundle constraints L0 - OSGi Minimum Execution Environment CDC/Foundation JavaSE

OSGi Modularity (1/4) Multi-version support i.e., side-by-side versions Explicit code boundaries and dependencies i.e., package imports and exports Support for various sharing policies i.e., arbitrary version range support

OSGi Modularity (2/4) Arbitrary export/import attributes for more control Influence package selection Sophisticated class space consistency model Ensures code constraints are not violated Package filtering for fine-grained class visibility Exporters may include/exclude specific classes from exported package

OSGi Modularity (3/4) Bundle fragments A single logical module in multiple physical bundles Bundle dependencies Allows for tight coupling when required

OSGi Modularity (4/4) Dynamic module deployment and dependency resolution Provided package existing bundle OSGi framework

OSGi Modularity (4/4) Dynamic module deployment and dependency resolution install bundle.jar existing bundle OSGi framework

OSGi Modularity (4/4) Dynamic module deployment and dependency resolution resolve bundle existing bundle OSGi framework

OSGi Modularity (4/4) Dynamic module deployment and dependency resolution automatic package dependency resolution existing bundle OSGi framework

Leveraging OSGi Modularity Text editor + jar Just add metadata to your JAR file's manifest Eclipse Plug-in Development Environment (PDE) directly supports bundles Bundle packaging tools BND from Peter Kriens Apache Felix maven-bundle-plugin based on BND

OSGi Services (1/3) OSGi framework promotes serviceoriented interaction pattern among bundles Possible to use modules without services Service Registry Publish Service Provider Service Description Interact Find Service Requester

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

OSGi Services (3/3) Dynamic service lookup Provided service Provided package existing bundle component OSGi framework

OSGi Services (3/3) Dynamic service lookup install bundle.jar existing bundle component OSGi framework

OSGi Services (3/3) Dynamic service lookup activate bundle existing bundle component OSGi framework

OSGi Services (3/3) Dynamic service lookup automatic package dependency resolution existing bundle component OSGi framework

OSGi Services (3/3) Dynamic service lookup manual service dependency resolution existing bundle component OSGi framework

OSGi Services Advantages Lightweight services Direct method invocation Good design Separates interface from implementation Enables reuse, substitutability, loose coupling, and late binding Dynamics Loose coupling and late binding make it possible to support run-time dynamism Application's configuration is simply the set of deployed bundles Deploy only the bundles that you need

OSGi Services Issues 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-OSGi, ipojo Sophisticated service-oriented component frameworks Automated dependency injection and more More modern, POJO-oriented approaches

Apache Felix Status

Apache Felix (1/4) Top-level project (April 2007) Apache licensed open source implementation of OSGi R4 Framework (in progress, stable and functional) Version 1.0.1 currently available Services (in progress, stable and functional) Package Admin, Start Level, URL Handlers, Declarative Services, UPnP Device, HTTP Service, Configuration Admin, Preferences, User Admin, Wire Admin, Event Admin, Meta Type, and Log OSGi Bundle Repository (OBR), Dependency Manager, Service Binder, Shell, ipojo, Mangen

Apache Felix (2/4) Felix community is growing strong 20 committers Code granted and contributed from several organizations and communities Grenoble University, ObjectWeb, CNR-ISTI, Ascert, Luminis, Apache Directory, INSA, DIT UPM, Day Management AG Several community member contributions Apache projects interested in Felix and/or OSGi Directory, Cocoon, JAMES, Jackrabbit, Harmony, Derby

Apache Felix (3/4) Felix bundle developer support Apache Maven2 bundle plugin Merges OSGi bundle manifest with Maven2 POM file Automatically generates metadata, such as Bundle-ClassPath, Import-Package, and Export- Package Greatly simplifies bundle development by eliminating error-prone manual header creation process Automatically creates final bundle JAR file Also supports embed required packages, instead of importing them

Apache Felix (4/4) Felix Commons Effort to bundle-ize common open source libraries Recently started Includes 13 bundles, such as antlr, cglib, commons-collections, etc. All community donated wrappers Roadmap Continue toward R4 and R4.1 compliance Largely only missing support for fragments

Example Application

Simple Paint Program Defines a SimpleShape interface to draw shapes Different implementations of SimpleShape can be created to draw different shapes Each shape has name and icon properties Available shapes are displayed in tool bar To draw a shape, click on its button and then click in the drawing canvas Shapes cannot be dragged, but not resized Shape implementations can be dynamically installed/removed

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 triangle. **/ public void draw(graphics2d g2, Point p); }

Paint Program Realization

High-Level Architecture Shape Tracker 1 1 Drawing Frame 1 * Default Shape 1 1 1 1 * 1 Shape Component Simple Shape

High-Level Architecture Shape Tracker Best practice Try to centralize interaction with OSGi API so that other Drawing components remain Default Frame POJOs...only Shape Shape Tracker will interact with OSGi API. 1 1 1 1 * 1 1 1 * 1 Shape Component Simple Shape

High-Level Architecture Shape Tracker Best practice Try to centralize interaction with OSGi API so that other Drawing components remain Default Frame POJOs...only Shape Shape Tracker will interact with OSGi API. 1 1 1 1 * 1 1 Best practice Do not make assumptions Shape about threads...since Component we are creating a Swing application, Shape Tracker sends events on Swing thread. 1 * 1 Simple Shape

High-Level Architecture Shape Tracker 1 1 1 * Drawing Frame 1 1 Default Shape 1 1 Main application window Shape gets dynamically Component injected with available shapes from the Shape Tracker. * 1 Simple Shape

High-Level Architecture Shape Tracker 1 1 1 * Drawing Frame 1 1 Default Shape 1 1 * 1 Shape Actual Component shape implementation. Simple Shape

High-Level Architecture Injected proxied shape Shape implementation to Drawing hide Tracker aspects of dynamism Frame and provide a default implementation. 1 1 1 1 1 * Default Shape 1 1 * 1 Shape Actual Component shape implementation. Simple Shape

High-Level Architecture Shape Tracker Component that draws the shape in parent frame; looks up Drawing shape via Drawing Frame rather than having a direct reference. 1 1 1 * 1 1 Default Shape 1 1 * 1 Shape Component Simple Shape

Implementing the Design The design is reasonably complete, but what is the precise approach we use for implementation? It depends... There are a few approach options when building OSGi-based applications...

OSGi Application Approaches

OSGi Application Approaches When creating an OSGi-based application there are two main orthogonal issues to consider Service model vs. extender model Bundled application vs. hosted framework The first issue is related to choosing the actual OSGi extensibility mechanism The second issue is an advanced topic to be discussed later, but is related to who is in control of whom

Service vs. Extender Models Two different approaches for adding extensibility to an OSGi-based application The service-based approach uses the OSGi service concept and the service registry as the extensibility mechanism The extender-based approach uses the OSGi installed bundle set as the extensibility mechanism Advantages and disadvantages for each Can be used independently or together

Service Model Service registry

Service Model Service registry Service publication

Service Model Service registry Service event

Service Model Service registry Service request

Service Model Service registry Service binding

Service Whiteboard Pattern Best practice Instead of having clients look up and use a service interface, have clients register a service interface to express their interest The service tracks the registered client interfaces and calls them when appropriate Simple, more robust, leverages the OSGi service model This is called the Whiteboard Pattern It can be considered an Inversion of Control pattern

Service-Based Paint Program SimpleShape service interface public interface SimpleShape { // A service property for the name of the shape. public static final String NAME_PROPERTY = "simple.shape.name"; // A service property for the icon of the shape. public static final String ICON_PROPERTY = "simple.shape.icon"; } // Method to draw the shape of the service. public void draw(graphics2d g2, Point p);

Service-Based Shape Tracker Recall goal of the Shape Tracker Use Inversion of Control principles to inject shapes into application Puts tracking logic in one place Isolates application from OSGi API Implemented as an OSGi Service Tracker subclass Uses whiteboard pattern for services Listens for SimpleShape service events Result from service publications into OSGi service registry

Extender Model Installed bundles

Extender Model Install bundle.jar Installed bundles

Extender Model Create bundle Installed bundles

Extender Model Installed bundles Bundle event

Extender Model Installed bundles Interrogate for metadata, resource, classes, etc.

Extension-Based Paint Program SimpleShape extension interface public interface SimpleShape { // A property for the name of the shape. public static final String NAME_PROPERTY = "Extension-Name"; // A property for the icon of the shape. public static final String ICON_PROPERTY = "Extension-Icon"; // A property for the class of the shape. public static final String CLASS_PROPERTY = "Extension-Class"; } // Method to draw the shape of the extension. public void draw(graphics2d g2, Point p);

Extension-Based Paint Program Extension bundles include extensionrelated metadata in their JAR manifest for example...... Extension-Name: Circle Extension-Icon: org/apache/felix/circle/circle.png Extension-Class: org.apache.felix.circle.circle...

Extender-Based Shape Tracker Recall goal of the Shape Tracker Use Inversion of Control principles to inject shapes into application Puts tracking logic in one place Isolates application from OSGi API Implemented as custom bundle tracker Uses similar whiteboard pattern, but for installed bundles Listens for bundle events Specifically, STARTED and STOPPED events Probes bundle manifests to see if bundles provide shape extensions

Example Application Demo

Advances Issues

Bundled vs. Hosted Applications can leverage OSGi functionality in two ways Build entire application as a set of bundles that will run on top of a framework instance Host a framework instance inside application and externally interact with bundles/services

Bundled vs. Hosted Building application as a set of bundles is the preferred approach Allows application to run on any framework Not always possible for legacy applications Hosting framework instance allows piecemeal OSGi adoption Will likely tie application to a framework implementation

Hosted Framework More complicated since due to external/internal gap e.g., unlike bundles, the host application does not have a bundle context by which it can access framework services Required host/framework interactions Accessing framework functionality Providing services to bundles Using services from bundles

Hosted Framework Felix tries to simplify hosted instance scenarios All configuration data is passed into constructor Felix framework implements Bundle interface and acts as the System Bundle Gives the host application an intuitive way to access framework functionality Felix constructor also accepts constructor activators to extend system bundle Felix tries to multiplex singleton resources to allow for multiple framework instances

Hosted Framework // Define configuration properties Map configmap = new StringMap(false); configmap.put(...,...);... // Create application activators List list = new ArrayList(); list.add(new Activator()); try { // Create a framework instance Felix felix = new Felix(configMap, list); // Start framework instance felix.start();... // Stop framework instance felix.stop(); } catch (Exception ex) {... }

Hosted Framework Providing a host application service BundleContext bc = felix.getbundlecontext(); bc.registerservice(service.class, svcobj, null);

Hosted Framework Providing a host application service BundleContext bc = felix.getbundlecontext(); bc.registerservice(service.class, svcobj, null); Accessing internal bundle services BundleContext bc = felix.getbundlecontext(); ServiceReference ref = bc.getservicereference(service.class); Service svcobj = (Service) bc.getservice(ref);

Hosted Framework Providing a host application service BundleContext bc = felix.getbundlecontext(); bc.registerservice(service.class, svcobj, null); Accessing internal bundle services BundleContext bc = felix.getbundlecontext(); ServiceReference ref = bc.getservicereference(service.class); Service svcobj = (Service) bc.getservice(ref); Better approach is to use a constructor activators since it is integrated with System Bundle (i.e., framework) starting and stopping

Hosted Framework Classes shared among host application and bundles must be on the application class path Disadvantage of hosted framework approach, which limits dynamics Use of reflection by host to access bundle services can eliminate this issue, but it is still not an optimal solution In summary, better to completely bundle your application if possible

Custom Life Cycle Layer [placeholder] Can separate service and life cycle layers from modularity layer Create your own life cycle layer using the extender model to incorporate your own component model life cycle layer and/or component interaction layer

Conclusion