Xander Uiterlinden
Sander Mak
!
Luminis Technologies
@uiterlix
@sander_mak
The Ultimate Dependency
Manager Shootout
@uiterlix
@sander_mak
Who we are
Sander Mak
http://branchandbound.net
@sander_mak
http://blog.uiterlinden.nl
@uiterlix
Xander Uiterlinden
@uiterlix
@sander_mak
Agenda
OSGi Services
Dependency Managers
Comparison
Overview/community
Code
Performance
Conclusion
OSGi Services
@uiterlix
@sander_mak
OSGi Services
Provider Bundle!
api.MyService
impl.MyServiceImpl
Consumer
Bundle
new MyServiceImpl()
Strong coupling to implementation
!
What if provider bundle not available/stops?
!
What about configuration?
api + impl package dependency
@uiterlix
@sander_mak
register OSGi Service
Registry
Provider Bundle!
api.MyService
impl.MyServiceImpl
Consumer!
Bundle
lookup
only api package dependency
Decoupling through interfaces
Inversion of Control
Service dynamics
OSGi Services
Dependency Managers
@uiterlix
@sander_mak
Why Dependency Managers?
@uiterlix
@sander_mak
Why Dependency Managers?
@uiterlix
@sander_mak
Why Dependency Managers?
@uiterlix
@sander_mak
Why Dependency Managers?
Cut down the boilerplate
Decouple from OSGi APIs
Dependency Injection
Testability
Component models
Aspects
Adapters
Etc.
@uiterlix
@sander_mak
Why Dependency Managers?
Cut down the boilerplate
Decouple from OSGi APIs
Dependency Injection
Testability
Component models
Aspects
Adapters
Etc.
Components…?!
!
org.apache.felix.ipojo.annotations.Component!
org.osgi.service.component.annotations.Component
aQute.bnd.annotation.component.Component!
org.apache.felix.dm.annotation.api.Component!
org.springframework.stereotype.Component!
….
!
Notions: contract-based, reactive, explicit lifecycle
Comparison
@uiterlix
@sander_mak
The lineup
Felix
Dependency
Manager
Felix iPojo
Declarative
Services
Blueprint
@uiterlix
@sander_mak
The lineup
Felix
Dependency
Manager
Felix iPojo
Compendium
Specifications
Declarative
Services
Blueprint
@uiterlix
@sander_mak
The lineup
Felix
Dependency
Manager
Felix iPojo
Implementations
Compendium
Specifications
Declarative
Services
Blueprint
@uiterlix
@sander_mak
The lineup
Felix
Dependency
Manager
Felix iPojo
Implementations
Compendium
Specifications
Declarative
Services
!
!
KnopflerFish
!
!
Equinox
!
!
Apache Aries
Felix Service
Component
Runtime
Eclipse Gemini
Blueprint
Blueprint
@uiterlix
@sander_mak
The lineup: disclaimer
We primarily work with (and on) Felix DM
@uiterlix
@sander_mak
Since R4 (2005)
DS 1.1 with R4.2, DS 1.2 with R5
XML based
True POJOs
Or: DS annotations to generate XML
!
Declarative Services
@uiterlix
@sander_mak
Since R4 (2005)
DS 1.1 with R4.2, DS 1.2 with R5
XML based
True POJOs
Or: DS annotations to generate XML
!
Additional abstractions:
ComponentContext for each component
ComponentFactory: client initiates instantiation
Bundle 1
Component!
Instance
Component!
Description
Bundle 2
Component!
Instance
Component!
Description
Service
reference
provide
Declarative Services
@uiterlix
@sander_mak
Felix SCR
Last release
User list
License
March 2014
~50 msg
Apache 2.0
Open issues 25
Since 2007
@uiterlix
@sander_mak
Eclipse Gemini Blueprint
DM Server Gemini Blueprint
Spec since R4.2 (2009)
Familiar for Spring devs
Declarative: XML based
Annotations in Aries, but not in spec (or Gemini)
Components proxied: ‘Dampens’ service dynamics
2009
@uiterlix
@sander_mak
Eclipse Gemini Blueprint
DM Server Gemini Blueprint
Spec since R4.2 (2009)
Familiar for Spring devs
Declarative: XML based
Annotations in Aries, but not in spec (or Gemini)
Components proxied: ‘Dampens’ service dynamics
2009
Bundle 1
Application
Context
Bundle 2
Service
reference
export
Bean
Bean
Bean
Application
Context
Bean
Bean
@uiterlix
@sander_mak
Eclipse Gemini Blueprint
Last release
User list
License
August 2012
~60 msg
EPL
Open issues 17
Since 2009
@uiterlix
@sander_mak
Lots of 404s :(
Eclipse Gemini Blueprint
Last release
User list
License
August 2012
~60 msg
EPL
Open issues 17
Since 2009
@uiterlix
@sander_mak
Lots of 404s :(
Eclipse Gemini Blueprint
Last release
User list
License
August 2012
~60 msg
EPL
Open issues 17
Since 2009
@uiterlix
@sander_mak
Felix Dependency Manager
DSL for component definition in Activator
Programmatic
Annotation based (bnd plugin)
Embraces service dynamics
@uiterlix
@sander_mak
Felix Dependency Manager
DSL for component definition in Activator
Programmatic
Annotation based (bnd plugin)
Embraces service dynamics
Bundle 1
Component!
Instance
Bundle 2
Component!
Instance
Component!
Instance
Service
reference
adapt
Service’
publish
Service
aspect
Additional abstractions:
Aspect: intercept and republish service
Adapter: publish service with adapted interface
@uiterlix
@sander_mak
Felix Dependency Manager
Last release
User list
License
Januari 2013
~1 msg
Apache 2.0
Open issues 22
Since 2004
@uiterlix
@sander_mak
Programmatic API, XML and annotations
Proxy based
Bytecode manipulation
Felix iPojo
@uiterlix
@sander_mak
Programmatic API, XML and annotations
Proxy based
Bytecode manipulation
Felix iPojo
Bundle 1 Bundle 2
Component
Component!
instance
Service
provide
Component
require
Component!
instance
!
!
Composites: intra-bundle mechanism
Scoped service registries
Pluggable handlers
Additional abstractions:
@uiterlix
@sander_mak
Felix iPojo
Last release
User list
License
March 2014
~130 msg
Apache 2.0
Open issues 30
Since 2008
@uiterlix
@sander_mak
Felix iPojo
Last release
User list
License
March 2014
~130 msg
Apache 2.0
Open issues 30
Since 2008
Best site among DMs!
Comparison: code
@uiterlix
@sander_mak
The example
http://bit.ly/dmshootout
@uiterlix
@sander_mak
Extender pattern
Application bundle 1
Application bundle 2
Application bundle 3
SCR/iPojo/Blueprint/(DM!
runtime) bundle
Service Registry
Some-Header: … register
services
@uiterlix
@sander_mak
Declarative Services
META-INF/MANIFEST.MF!
OSGI-INF/temp.xml!
!
TemperatureSensor.class
Temperate Sensor
Bundle
@uiterlix
@sander_mak
Declarative Services
META-INF/MANIFEST.MF!
OSGI-INF/temp.xml!
!
TemperatureSensor.class
Temperate Sensor
Bundle
@uiterlix
@sander_mak
Declarative Services
META-INF/MANIFEST.MF!
OSGI-INF/temp.xml!
!
TemperatureSensor.class
Temperate Sensor
Bundle
@uiterlix
@sander_mak
Declarative Services
Dashboard Bundle
@uiterlix
@sander_mak
Declarative Services
Dashboard Bundle
@uiterlix
@sander_mak
Declarative Services
Dashboard Bundle
@uiterlix
@sander_mak
Declarative Services
Dashboard Bundle
@uiterlix
@sander_mak
Declarative Services
Dashboard Bundle
@uiterlix
@sander_mak
Declarative Services
Dashboard Bundle
@uiterlix
@sander_mak
Declarative Services
Dashboard Bundle
@uiterlix
@sander_mak
Declarative Services
No direct field injection
Defaults:
Delayed component (activate on use)
Static policy -> many reactivations
!
!
!
Static Dynamic
Reluctant Do nothing Rebind optionals
Greedy Reactivate Rebind
What if
‘better’
service
arrives?
@uiterlix
@sander_mak
META-INF/MANIFEST.MF!
OSGI-INF/blueprint/temp.xml!
!
TemperatureSensor.class
Temperate Sensor
Bundle
BluePrint
@uiterlix
@sander_mak
META-INF/MANIFEST.MF!
OSGI-INF/blueprint/temp.xml!
!
TemperatureSensor.class
Temperate Sensor
Bundle
Bundle-Blueprint header optional
BluePrint
@uiterlix
@sander_mak
META-INF/MANIFEST.MF!
OSGI-INF/blueprint/temp.xml!
!
TemperatureSensor.class
Temperate Sensor
Bundle
Bundle-Blueprint header optional
BluePrint
@uiterlix
@sander_mak
BluePrint
Dashboard Bundle
snipped 10+ lines of namespaces :(
@uiterlix
@sander_mak
BluePrint
Dashboard Bundle
snipped 10+ lines of namespaces :(
@uiterlix
@sander_mak
BluePrint
Dashboard Bundle
snipped 10+ lines of namespaces :(
@uiterlix
@sander_mak
BluePrint
Dashboard Bundle
snipped 10+ lines of namespaces :(
@uiterlix
@sander_mak
BluePrint
Dashboard Bundle
snipped 10+ lines of namespaces :(
@uiterlix
@sander_mak
BluePrint
Dashboard Bundle
snipped 10+ lines of namespaces :(
@uiterlix
@sander_mak
BluePrint
Dashboard Bundle
snipped 10+ lines of namespaces :(
@uiterlix
@sander_mak
BluePrint
Dashboard Bundle
snipped 10+ lines of namespaces :(
@uiterlix
@sander_mak
BluePrint!
Strong focus on intra-bundle composition
Hides dynamicity (until TimeOutException…)
If dependency goes away, component is not
stopped. If service is exposed, unregisters it.
No lazy activation like DS
Whole ‘applicationContext’ started or not
(Custom) TypeConverters
Constructor/setter injection, no field injection
Namespace hell :(
!
@uiterlix
@sander_mak
Felix Dependency Manager
META-INF/MANIFEST.MF!
!
Activator.class!
TemperatureSensor.class
Temperate Sensor
Bundle
@uiterlix
@sander_mak
Felix Dependency Manager
META-INF/MANIFEST.MF!
!
Activator.class!
TemperatureSensor.class
Temperate Sensor
Bundle
@uiterlix
@sander_mak
Felix Dependency Manager
META-INF/MANIFEST.MF!
!
Activator.class!
TemperatureSensor.class
Temperate Sensor
Bundle
@uiterlix
@sander_mak
Felix Dependency Manager
META-INF/MANIFEST.MF!
!
Activator.class!
TemperatureSensor.class
Temperate Sensor
Bundle
@uiterlix
@sander_mak
Felix Dependency Manager
META-INF/MANIFEST.MF!
!
Activator.class!
TemperatureSensor.class
Temperate Sensor
Bundle
@uiterlix
@sander_mak
Felix Dependency Manager
Dashboard Bundle
@uiterlix
@sander_mak
Felix Dependency Manager
Dashboard Bundle
@uiterlix
@sander_mak
Felix Dependency Manager
Dashboard Bundle
@uiterlix
@sander_mak
Felix Dependency Manager
Dashboard Bundle
@uiterlix
@sander_mak
Felix Dependency Manager
Dashboard Bundle
@uiterlix
@sander_mak
Felix Dependency Manager
Dashboard Bundle
@uiterlix
@sander_mak
Felix Dependency Manager
Dashboard Bundle
@uiterlix
@sander_mak
Felix Dependency Manager
Dashboard Bundle
@uiterlix
@sander_mak
Felix Dependency Manager
It’s code: dynamically create and depend
on services
Annotations available (+ bnd plugin)
Field injection, NullObject pattern
Manual mgmt. of list of dependencies :(
Services registered eagerly from Activator
Features: aspects, adapters
!
DM 4 coming up…
@uiterlix
@sander_mak
Felix Dependency Manager
https://bitbucket.org/uiterlix/ravioli
!
@uiterlix
@sander_mak
Felix Dependency Manager
https://bitbucket.org/uiterlix/ravioli
!
@uiterlix
@sander_mak
Felix iPojo
!
TemperatureSensor.class!
metadata.xml!
!
META-INF/MANIFEST.MF!
Temperate Sensor
Bundle
Generated by IDE plugin by processing annotations
and metadata.xml
@uiterlix
@sander_mak
Felix iPojo
!
TemperatureSensor.class!
metadata.xml!
!
META-INF/MANIFEST.MF!
Temperate Sensor
Bundle
Generated by IDE plugin by processing annotations
and metadata.xml
@uiterlix
@sander_mak
Felix iPojo
@uiterlix
@sander_mak
Felix iPojo
@uiterlix
@sander_mak
Felix iPojo
@uiterlix
@sander_mak
Felix iPojo
@uiterlix
@sander_mak
Felix iPojo
@uiterlix
@sander_mak
Felix iPojo
@uiterlix
@sander_mak
Felix iPojo
@uiterlix
@sander_mak
Felix iPojo
@uiterlix
@sander_mak
Felix iPojo
@uiterlix
@sander_mak
Felix iPojo
@uiterlix
@sander_mak
Felix iPojo
Both ‚static’ configuration and configuration using code
Dependency manager with the most advanced
features:
External handlers
Service binding interceptors
Stereotypes
Annotations limited to declaring components and
‚simple’ instances. XML recommended for declaring
instances.
Shell commands for component inspection
!
Comparison: performance
@uiterlix
@sander_mak
Benchmarks
Don’t be afraid of too many services ?
Promises…
!
„Each bundle may register zero or more
services. Each bundle may also use zero or
more services. There exists no limit on the
number of services, more than the ones given
by memory limits or java security permissions.”
(Knoplerfish tutorial)
@uiterlix
@sander_mak
Benchmark scenario
!
!
Temperature sensors for each
postal code in the Nederlands
463860 Sensor services
!
Service properties:
- Province
- Municipality
- City
- PostalCode
@uiterlix
@sander_mak
Benchmarks
Publishing Sensor services
Felix, Equinox, Knoplerfish
Plain OSGi, DM, iPojo
!
Consuming Sensor services
Whiteboard; all sensors in Amsterdam

(&(province=Noord-Holland)(municipality=Amsterdam))
Felix, Equinox, Knoplerfish
DS, DM, iPojo, Blueprint
@uiterlix
@sander_mak
Disclaimer
Results are as-is, no further investigation
done
No optimizations done
!
You can repeat these tests yourself.
Projects are available on github
http://bit.ly/dmshootout
@uiterlix
@sander_mak
Register services (Equinox)
ipojo
DM
OSGi
Durationinms.
0
175000
350000
525000
700000
10000 30000 50000 70000 90000 110000 130000 150000 170000 190000 210000 230000 250000 270000 290000 310000 330000 350000 370000 390000 410000 430000 450000
OSGi DM iPojo
@uiterlix
@sander_mak
0
50000
100000
150000
200000
250000
10000 30000 50000 70000 90000 110000 130000 150000 170000 190000 210000 230000 250000 270000 290000 310000 330000 350000 370000 390000 410000 430000 450000
OSGi DM iPojo
Register services (Felix)
iPojo
DM
OSGi
@uiterlix
@sander_mak
0
50000
100000
150000
200000
250000
10000 30000 50000 70000 90000 110000 130000 150000 170000 190000 210000 230000 250000 270000 290000 310000 330000 350000 370000 390000 410000 430000 450000
OSGi DM iPojo
Register services (Knoplerfish)
iPojo
DM
OSGi
@uiterlix
@sander_mak
0
100000
200000
300000
400000
500000
600000
700000
10000 30000 50000 70000 90000 110000 130000 150000 170000 190000 210000 230000 250000 270000 290000 310000 330000 350000 370000 390000 410000 430000 450000
OSGi equinox DM equinox iPojo equinox OSGi felix DM felix iPojo felix
OSGi knoplerfish DM knoplerfish iPojo knoplerfish
Register services (combined)
iPojo Equinox
OSGi & DM Felix
iPojo Felix & Knoplerfish
OSGi & DM Equinox & Knoplerfish
@uiterlix
@sander_mak
Register services
Observations
Non linear results for registering
services with Felix
Registering services using iPojo takes
considerably longer compared to plain
OSGi and DM
@uiterlix
@sander_mak
Timeinmillis
0
400
800
1200
1600
blueprint dm ds ipojo
Consuming services
Injecting 19021 services into a single consumer on Equinox
@uiterlix
@sander_mak
Timeinmillis
0
400
800
1200
1600
blueprint dm ds ipojo
injection injection and method invocation
Method invocation overhead
Injecting 19021 services into a single consumer on Equinox,
and invoking a method on the injected services
@uiterlix
@sander_mak
iPojo and # of services
Timeinmillis
0
15000
30000
45000
60000
# services in service registry
50 100 150 200 250 300 350 400 450 500 550 600 650 700 750 800 850 900 950 1000 1050 1100 1150 1200 1250 1300 1350 1400 1450 1500 1550 1600
iPojo
Injecting a single service into a single consumer on Equinox
@uiterlix
@sander_mak
Performance considerations
Use of LDAP filters
Filter complexity, service registry scans
Felix DM provides optimization though
indexing service properties
!
!
Bundle starting order
Service tracker obtain initial versus service
listener events
0
75000
150000
225000
300000
197 2878
Default With index
Conclusion
@uiterlix
@sander_mak
Conclusion
Features ranging from simple to advanced 

(DS, Blueprint < DM < iPojo)
Annotation/XML-only frameworks are easy to
use but provide less dynamics
Consider the expected size of your application
(services, dependencies) and run some test
before choosing one!
You can mix & match
… but don’t do that
@uiterlix
@sander_mak
Questions?
http://bit.ly/dmshootoutCode:
Sander Mak
http://branchandbound.net
@sander_mak
http://blog.uiterlinden.nl
@uiterlix
Xander Uiterlinden

The Ultimate Dependency Manager Shootout (QCon NY 2014)