Intro To OSGi
-
Upload
stephan-janssen -
Category
Business
-
view
6.077 -
download
2
description
Transcript of Intro To OSGi
www.bejug.org
Introduction in OSGi
2009
www.bejug.org
Speaker’s qualifications
Lead architect & project manager @ Ebit 10 years experience in JSE/JEE
development Steering member of the Devoxx conference
and BeJUG Talks at Bejug & SpringOne Prince2 and Scrum certified
www.bejug.org
Imtech ICT Belgium
www.bejug.org
3 Companies – 1 Mindset
Infrastructure
Solutions and
Services
Development of
Software Solutions
JavaOpen Source
Data Warehousi
ng
BusinessIntelligenc
e
ICT Solutions and Services - Since 1996 Specific and in-depth knowledge – 78
employees
www.bejug.org
Agenda
Modularity in Java OSGi Basics OSGi Best Practices Conclusion
www.bejug.org
Modularity in Java
Modularity Matters– Component reuse– Consistency– Efficiency– Robustness– Maintainability– Scalability
www.bejug.org
Modularity in Java
Different approaches:– OSGi– HK2 (Apache Harmony)– JSR 277/294– JSR 232/291– Spar– Jigsaw project (only JDK)– …
www.bejug.org
Modularity in Java
Common problems in Java– JAR HELL– No versioning– The Classpath– Class visibility– Hot deployment– Write once, run anywhere
www.bejug.org
Agenda
Modularity in Java OSGi Basics OSGi Best Practices Conclusion
www.bejug.org
OSGi Basics
What is OSGi Classloading in OSGi The Bundle Lifecycle OSGi Services Demo
www.bejug.org
What is OSGi
OSGi is a service oriented platform On top of a unique classloading mechanism Enabling features like:
– Versioning– Encapsulation– Runtime Dynamics
www.bejug.org
What is OSGi
www.bejug.org
OSGi Basics
What is OSGi Classloading in OSGi
Welcome to the World ofClassNotFoundExceptions and
ClassDefNotFoundErrors
The Bundle Lifecycle OSGi Services Demo
www.bejug.org
Classloading in OSGi
Classloading 1 O 1– What is a class?
Compile time Runtime
– A classloader defines an isolated class space.
www.bejug.org
Classloading in OSGi
How can a classloader share it’s class space with other classloaders? Classloader hierarchy
• Linear hierarchy• Tree hierarchy
Classloader delegation model• Parent first delegation model• Child first delegation model
www.bejug.org
Classloading in OSGi
Default linear parent first delegation model
www.bejug.org
Classloading in OSGi
Linear parent first delegation model no versioning Breaking the linear structure to allow
versioning public static void main(String[] args) throws Exception {
URL[] urls = ((URLClassLoader)TestApp.class.getClassLoader()).getURLs();
URLClassLoader urlCL = new URLClassLoader(urls, null);
Class personClass = urlCL.loadClass("be.ebit.bejug.model.Person");
Object personInstance = personClass.newInstance();
Person p = (Person) personInstance;
}
www.bejug.org
Classloading in OSGi
Tree parent delegation model:
www.bejug.org
Classloading in OSGi
Moving towards OSGi: public static void main(String[] args) throws Exception {
//Path to model.jar version 1
URL[] urls = new URL[]{new URL(“<path>/modelv1.jar”)}
//Path to model.jar version 2
URL[] urls = new URL[]{new URL(“<path>/modelv2.jar”)}
URLClassLoader urlCL1 = new URLClassLoader(urls,null);
URLClassLoader urlCL2 = new URLClassLoader(urls,null);
Class personClassV1 = urlCL1.loadClass("be.ebit.springone.model.Person");
Class personClassV2 = urlCL2.loadClass("be.ebit.springone.model.Person");
}
www.bejug.org
Classloading in OSGi
www.bejug.org
Classloading in OSGi
How does OSGi fit in?– ModelV1.jar Bundle A– ModelV2.jar Bundle B Each bundle with its own ClassLoader (and thread)
The non-linear classloader structure allows versioning within one JVM.
Basic principle behind the versioning capabilities in OSGi.
Cfr. Servlet containers
www.bejug.org
Classloading in OSGi
www.bejug.org
Classloading in OSGi
The parent first delegation model does NOT allow communication between bundle classloaders– The FrontV1 bundle classloader cannot get a
Person class Solution?
– Extending the classloading mechanism
www.bejug.org
Classloading in OSGi
www.bejug.org
Classloading in OSGi
Bundle classloaders can delegate classloading to:– The parent classloader
parent first delegation– Other bundle classloaders
bundle delegation
The problem is choice:– Parent or bundle delegation?– If bundle delegation: to which bundle classloader?
www.bejug.org
Classloading in OSGi
OSGi Delegation Rules:– Parent Delegation Model is used if:
– Otherwise Bundle Delegation Model is used
www.bejug.org
Classloading in OSGi
The Bundle Delegation Model:– To which bundle classloader to delegate?– Metadata in the Bundle Manifest to the rescue:
1 Import/export-packages– what packages are needed by the bundle.– what packages are provided by the bundle.
2 Required bundles 3 Bundle classpath 4 Fragment bundles 5 Dynamic imports
www.bejug.org
Classloading in OSGi
How to wire the classloaders? Classloader infrastructure General wiring resolution rules:
– Ensures that only one version of a class is visible within a classloader:
class space consistency– Uses the highest version within the constraints
specified Version ranges Custom qualifiers
www.bejug.org
Classloading in OSGi
www.bejug.org
Classloading in OSGi
Constraint solving: an example
www.bejug.org
Classloading in OSGi
For each imported package a wire exists to the providing bundle classloader
The wires are calculated at bundle resolution This wiring is NOT static:
– Bundles can come and go– Dynamic updates
This wiring process is repeated (partially) with each refresh without a JVM restart.
www.bejug.org
Classloading in OSGi
Bundle Delegation Model (Runtime)
www.bejug.org
Classloading in OSGi
The total picture:
www.bejug.org
Classloading in OSGi
Fine-tuning the choice of delegation model:– Bootdelegation:
Additional classes to be loaded by the parent classloader System property: org.osgi.framework.bootdelegation No versioning
– System packages: Exported by the system bundle (bundle 0) System property: org.osgi.framework.system.packages Versioning Takes part in the wiring process
Last option is preferred
www.bejug.org
Classloading in OSGi
www.bejug.org
Classloading in OSGi
Parent first delegation model:– No versioning– Static ‘wiring’– See-all approach
Bundle delegation model:– Versioning– By default, only the exports are visible– Support for dynamic updates/dynamic wiring
www.bejug.org
OSGi Basics
What is OSGi Classloading in OSGi The Bundle Lifecycle OSGi Services Demo
www.bejug.org
The Bundle Lifecycle
www.bejug.org
The Bundle Lifecycle
The Bundle Activator– Start() & Stop()– Resource Mgnt, Thread Mgnt, Services Lifecycle Mgnt
Events:– Bundle events– Framework events
The Bundle Context– Environment information– Installing bundles– Installing services
www.bejug.org
The Bundle Lifecycle
Bundle updates, uninstalls & refreshes– Update: migrate from one version to another
New exported packages are made available Old exported packages remain when used
– Uninstall New exported packages are made avialable Old exported packages remain when used
– RefreshPackages: The effective update & removal A package dependency graph is created The exporting bundle & all dependent bundles are stopped
and restarted.
www.bejug.org
The Bundle Lifecycle
Uninstall Model V1 Bundle
www.bejug.org
The Bundle Lifecycle
Model V1 Bundle is marked for deleting
www.bejug.org
The Bundle Lifecycle
Install & Start SecondFrontV1 Bundle – (imports be.ebit.bejug.model)
www.bejug.org
The Bundle Lifecycle
RefreshPackages (or restart framework)– Resolution (wiring) process is redone
www.bejug.org
OSGi Basics
What is OSGi Classloading in OSGi The Bundle Lifecycle OSGi Services Demo
www.bejug.org
OSGi Services
www.bejug.org
OSGi Services
Services Service interface Service implementation
ServiceFactories ServiceRegistry
Registration/Unregistration ServiceReference: search base
Service Events/Listeners
www.bejug.org
OSGi Services
Service lookup is text-based– Filter (interface + criteria)
Services can come and go Stale references
Services are fully loaded before registration Multi-threading
OSGi development is NOT trivial!
www.bejug.org
OSGi Services
Extension Points:– Not part of the specification– Extension points and extensions– One-to-many– Lazy loading– Less support for service dynamics (restart of
eclipse) Extension Points doesn’t solve all problems!
www.bejug.org
OSGi Services
Easing OSGi Component Development:– Declarative Services– Spring DM– iPOJO
Seperation of responsibilities:– Implementation of the service– Publication of the service
Two component models in the specification:– Declarative Services – RFC 124 (Spring DM-based).
www.bejug.org
OSGi Services
Common characteristics:– Declaration of services– Creation of services externalized (outside the
bundle)– Lazy loading– Service composition– Service dependencies & lifecycle management– Dynamic dependencies
www.bejug.org
OSGi Basics
What is OSGi Classloading in OSGi The Bundle Lifecycle OSGi Services Demo
www.bejug.org
Demo
www.bejug.org
Demo
www.bejug.org
Agenda
Modularity in Java OSGi Basics OSGi Best Practices Conclusion
www.bejug.org
OSGi Patterns & Best Practices
OSGi Patterns– Extender Pattern– Configuration Fragment Bundles– Whiteboard Pattern
www.bejug.org
Extender Pattern
www.bejug.org
Configuration Fragment Bundles
Examples: – Log4J configuration, – Custom configuration of the spring extender bundle
www.bejug.org
Whiteboard Pattern
www.bejug.org
OSGi Patterns & Best Practices
Best Practices:– Use imports instead of the parent classloader
(except java.*)– Minimize dependencies– Hide implementation details– Start ordering dependencies– Thread safety– Framework Callbacks– Classloader hierarchy dependencies– OSGi Framework coupling
www.bejug.org
Conclusion
OSGi is a platform full of potential:– Enhances encapsulation– Versioning– Runtime dynamics– Service-oriented
A different mindset is needed!
www.bejug.org
Q&A
– http://belgium.osgiusers.org– www.ouforum.be
www.bejug.org
Links
http://www.osgi.org http://www.springsource.org/osgi http://www.dynamicjava.org http://belgium.osgiusers.org