OSGi has gained popularity over the last two years. The platform has some very interesting features like versioning, dynamic updates and it's service oriented nature. These characteristics however come with a price. A firm understanding of how and why OSGi works how it works, is a necessity if you plan on getting into OSGi.
This talk will start with some basic principals on the java platform and will gradually move towards the OSGi infrastructure explaining the OSGi fundamentals. The following topics will be covered:
* Classloading in OSGi
* Lifecycle management of OSGi bundles
* OSGi Service, the service registry and service composition models
Afterwards, we will explain the generally accepted best practices and OSGi design patterns.
2. 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
4. 3 Companies – 1 Mindset
Developmen Data
Infrastruct t of Warehousi
ure Software ng
Solutions Solutions
and Business
Services Java Intelligenc
Open Source e
ICT Solutions and Services - Since 1996
Specific and in-depth knowledge – 78
employees
www.bejug.org
5. Agenda
Modularity in Java
OSGi Basics
OSGi Best Practices
Conclusion
www.bejug.org
8. Modularity in Java
Common problems in Java
– JAR HELL
– No versioning
– The Classpath
– Class visibility
– Hot deployment
– Write once, run anywhere
www.bejug.org
9. Agenda
Modularity in Java
OSGi Basics
OSGi Best Practices
Conclusion
www.bejug.org
10. OSGi Basics
What is OSGi
Classloading in OSGi
The Bundle Lifecycle
OSGi Services
Demo
www.bejug.org
11. 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
13. OSGi Basics
What is OSGi
Classloading in OSGi
Welcome to the World of
ClassNotFoundExceptions and
ClassDefNotFoundErrors
The Bundle Lifecycle
OSGi Services
Demo
www.bejug.org
14. Classloading in OSGi
Classloading 1 O 1
– What is a class?
Compile time
Runtime
– A classloader defines an isolated class space.
www.bejug.org
15. 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
17. 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
19. 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
21. 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
23. 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
25. 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
26. Classloading in OSGi
OSGi Delegation Rules:
– Parent Delegation Model is used if:
– Otherwise Bundle Delegation Model is used
www.bejug.org
27. 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
28. 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
31. 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
34. 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
36. 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
37. OSGi Basics
What is OSGi
Classloading in OSGi
The Bundle Lifecycle
OSGi Services
Demo
www.bejug.org
40. 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
47. OSGi Services
Services
Service interface
Service implementation
ServiceFactories
ServiceRegistry
Registration/Unregistration
ServiceReference: search base
Service Events/Listeners
www.bejug.org
48. 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
49. 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
50. 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
51. 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
52. OSGi Basics
What is OSGi
Classloading in OSGi
The Bundle Lifecycle
OSGi Services
Demo
www.bejug.org
60. 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
61. Conclusion
OSGi is a platform full of potential:
– Enhances encapsulation
– Versioning
– Runtime dynamics
– Service-oriented
A different mindset is needed!
www.bejug.org