Tutorial:Spring and OSGi Combined with Spring Dynamic Modules
Martin Lippert, aquinet it-agile GmbHBJ Hargrave IBM & CTO OSGi AllianceBJ Hargrave, IBM & CTO, OSGi Alliance
(Adrian Colyer, CTO, SpringSource)
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.01
A few words about myself…
• Martin LippertSenior IT consultant at akquinet it-agile GmbH, [email protected]
• FocusAgile soft are de elopmentAgile software developmentRefactoringEclipse technology
• Equinox incubator committer
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.02
Agenda• What is OSGi?• What is OSGi?• What is Spring Dynamic Modules?• Spring Dynamic Modules in ActionSpring Dynamic Modules in Action• Server-Side Applications• RCP Applicationspp• Summary
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.03
OSG – What?
• OSGi™:OSGi :„A dynamic module system for Java“
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.04
OSGi is …
• … a module system for Java that allows the definition of …
Modules (called „bundles“),Modules (called „bundles ),Visibility of the bundle contents (public-API vs. private-API)Dependencies between modulesVersions of mod lesVersions of modules
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.05
OSGi is …
• … dynamicBundles can be installed, started, stopped, uninstalled and updated at runtimeupdated at runtime
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.06
OSGi is …
• … service orientedBundles can publish services (dynamically)Bundles can find and bind to services through a service registryBundles can find and bind to services through a service registryThe runtime allows services to appear and disappear at runtime
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.07
What does OSGi look like? (Low Level)Identification
Bundle-SymbolicName: org.eclipse.equinox.registryBundle-Version: 3.2.100.v20060918Bundle-Name: Eclipse Extension RegistryBundle-Vendor: Eclipse.org
Bundle-ClassPath: ., someOtherJar.jar
B ndle Acti ator org eclipse core internal registr osgi Acti atorLifecycle
Classpath
Bundle-Activator: org.eclipse.core.internal.registry.osgi.Activator
Import-Package: javax.xml.parsers,org.xml.sax,
Dependencies
org.osgi.framework;version=1.3Require-Bundle: org.eclipse.equinox.common;bundle-version="[3.2.0,4.0.0)"Bundle-RequiredExecutionEnvironment: CDC-1.0/Foundation-1.0,J2SE-1.3
Exports
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.08
Export-Package: org.eclipse.equinox.registry
Implementations
• Open source implementationsOpen source implementationsEclipse Equinox (http://www.eclipse.org/equinox/)Apache Felix (http://cwiki.apache.org/FELIX/index.html)Knopflerfish (http://www.knopflerfish.org/)Knopflerfish (http://www.knopflerfish.org/)ProSyst mBedded Server Equinox Edition (http://www.prosyst.com/products/osgi_se_equi_ed.html)
• Commercial implementationsProSyst (http://www.prosyst.com/)Knopflerfish Pro (http://www.gatespacetelematics.com/)
(not necessarily complete)
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.09
What is Spring Dynamic Modules?• Project ObjectivesProject Objectives• Introduction to key Spring concepts• Bundles and module contexts• Application design• The extender patternWh ' i it?• Who's using it?
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.010
Spring Dynamic Modules is...• A open source project in• A open source project in
the Spring portfolio– led by SpringSource– committers from BEA and
Oracle– many non-code y
contributions from the community and from the OSGi EEG and CPEG
http://www.springframework.org/osgi
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Project Objectives
• Bring the benefits of OSGi:• Bring the benefits of OSGi:modularityversioninglifecycle support
• To enterprise application developmentTo enterprise application development
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Design considerations (raw OSGi)• Platform dynamics• Platform dynamics
– services may come and go at any time– ServiceTracker
• Asynchronous activation– service dependency management
T ti• Testing• Concurrency and thread management
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Project Objectives
• The simplicity and power of Spring• The simplicity and power of Spring...– with the dynamic module system of OSGi
• Modules need instantiating, configuring, decorating, g g g gassembling, ...
• Need an easy way to manage service references between modulesbetween modules
• Easy unit and integration testing
Bring the benefits of OSGi to enterprise applications
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Bring the benefits of OSGi to enterprise applications
Key Spring Concepts
SimpleSimpleSimpleObjectSimpleObjectj
Portable Service Abstractions
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
The Heart of Spring
• Lightweight container• Lightweight container– Full stack, simple object based application development
• Works in any environmenty– web-app, ejb, integration test, standalone
P id• Provides…– a powerful object factory that manages the instantiation,
configuration, decoration and assembly of business objects
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Spring-based development
• View application as a set of components• View application as a set of componentswith clear layering
• Each component is a simple objectEach component is a simple objectTestable in isolation
• Container manages component configuration and assemblyC t i d t t t ti• Container decorates your components at runtime
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Typical application layering
Web interface(MVC)
Other remoteinterfaces
presentationlayer
Service interfacesservicelayer
Domainobjects
DAO i t f
Service implementationslayer
DAO implementations
DAO interfacesdata accesslayer
RDBMS
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
RDBMS
Typical application layering
Web interface(MVC)
Other remoteinterfaces
Service interfaces
Domainobjects
DAO i t f
Service implementationsSpringmanaged
DAO implementations
DAO interfaces
RDBMS
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
RDBMS
Spring Framework
• Dependency injection• Dependency injection • Integration with persistence technologies (JDBC, Hibernate)
• Web application support Spring MVC, JSF and Struts• Enterprise service abstractions
TransactionsMessaging
• Aspect Oriented Programming supportAspect Oriented Programming support
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Without dependency injectionpublic class TransferServiceImpl implements TransferService {p p p {
private AccountRepository accountRepository;
public TransferServiceImpl() {DataSource ds = (DataSource)
ctx.lookup(“myAppserverDS”);accountRepository = new JdbcAccountRepository(ds);
}}…
}
Ti d t Jdb i l t tiTied to Jdbc implementationTied to application server JNDIHard to test. Hard to reuse
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Dependency Injection public class JdbcAccountRepository implements pub c c ass Jdbc ccou t epos to y p e e ts
AccountRepository {…
} Implements a service interface
public class TransferServiceImpl implements TransferService {private final AccountRepository accountRepository;
public TransferServiceImpl(AccountRepository ar) {this.accountRepository = ar;
}}…
} Depends on service interface;conceals complexity of implementation;
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
conceals complexity of implementation;allows for swapping out implementation
Spring Blueprint<beans>
<bean id=“transferService” class=“app.impl.TransferServiceImpl”><constructor-arg ref=“accountRepository” />
</bean>
<bean id=“accountRepository” class=“app.impl.JdbcAccountRepository”><constructor-arg ref=“dataSource” />
</bean></bean>
<bean id=“dataSource” class=“com.oracle.jdbc.pool.OracleDataSource”><property name=“URL” value=“jdbc:oracle:thin:@localhost:1521:BANK” />
t “ ” l “ t f ” /<property name=“user” value=“moneytransfer-app” /></bean>
</beans>
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Bundles and Module Contexts
• OSGi bundle <==> Spring Application Context• OSGi bundle <==> Spring Application Contextwe call it a module context
• Module context created when bundle is started• destroyed when bundle is stopped
• Module components <==> Spring beansinstantiated, configured, decorated, assembled by Spring
• Components can be imported / exported from OSGi service registry
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Application Design • Application becomes a set of co-operating bundles• Application becomes a set of co-operating bundles
– vertical decomposition first– then horizontal
• Communication via service registry
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Application wiring
P PP
S SLibLib
S SbLib
R R D
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Spring Dynamic ModulesSpring Dynamic Modules
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
The Extender pattern
• “The OSGi Extender Model”• The OSGi Extender ModelPeter Kriens, Feb. 2007http://www.osgi.org/blog/2007/02/osgi-extender-model.html
• [A]synchronous bundle listenerlisten to install, update, uninstall eventsinspect bundle contentinspect bundle contentTake appropriate action on behalf of the bundle
• Spring Dynamic Modules extender bundle:org.springframework.osgi.bundles.extendermust be installed and active for module contexts to be created
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
must be installed and active for module contexts to be created
Spring Dynamic Modules Users• OracleOracle
building next generation middleware platform on OSGi and Spring DM
• BEAWebLogic Event Server 2.0 built on Spring Dynamic Mod lesModules
• Over 1000 subscribers on mailing list
http://groups.google.com/group/spring-osgi
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
p g p g g g p p g g
Agenda• What is Spring Dynamic Modules?• What is Spring Dynamic Modules?• Spring Dynamic Modules in Action• Server-side ApplicationsServer side Applications• RCP Applications• Summaryy
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.030
Spring Dynamic Modules in Action• Creating a Spring-powered bundleCreating a Spring-powered bundle• Importing and exporting services• The whiteboard pattern• Dynamics• Startup and shutdown
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.031
Spring-powered bundles• Spring module context (app context) per bundle• Spring module context (app context) per bundle
(module)– created automatically for you by Spring extender bundle– no need to depend on any OSGi APIs
• META INF/spring/* xml• META‐INF/spring/*.xml
• or Spring‐Context header in MANIFEST.MF
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Spring powered bundlesSpring-powered bundles
P bli h d i t fPublished interfaces
ProtectedProtected implementations
Spring configurationfiles
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Demo/Exercise 1: Spring-powered bundle
• Step 1:• Step 1:Implement a bundle including a bundle activatorTry out your bundle via the console
• Step 2:Implement a POJO with a method “hello” and a methodImplement a POJO with a method hello and a method “goodbye”Create a spring context and define your POJO as a beanD fi th d i it d d t th dDefine your methods as init- and destroy-methodsTry out your bundle via the console using Spring DM
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Getting log output
• Spring uses Jakarta Commons Logging• Spring uses Jakarta Commons Logging• Commons logging doesn't behave well under OSGi
Use SLF4J binding insteadSimple Logging Facade for Java (http://www.slf4j.org/)
• Bundles:jcl104 over slf4j (static binding of jcl to slf4j)jcl104.over.slf4j (static binding of jcl to slf4j)slf4j.api (the slf4j API)slf4j.log4j12 (implementation of slf4j over log4j)
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Getting log outputosgi> log4j:WARN No appenders could be found for logger g g j pp gg(org.springframework.util.ClassUtils).
log4j:WARN Please initialize the log4j system properly.
• Where to put log4j.properties?which bundle is it that looks for this file?how do we make it visible to that bundle?
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Getting log output• Use a Fragment BundleUse a Fragment Bundle
“Fragments are bundles that are attached to a host bundle by the Framework.” - OSGi Core Specification, 3.14
Manifest-Version: 1.0Bundle-ManifestVersion: 2Bundle-Name: Logging Configuration FragmentBundle SymbolicName: com springsource logging configBundle-SymbolicName: com.springsource.logging.configBundle-Version: 1.0.0Bundle-Vendor: SpringSourceFragment-Host: org.springframework.osgi.log4j.osgi; bundle version="1 2 15 SNAPSHOT"bundle-version="1.2.15.SNAPSHOT"
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Demo/Exercise 2: log4j configuration
• Create a fragment for the log4j configuration• Create a fragment for the log4j configuration• Put the log4j configuration into this bundle• Attach the fragment to the log4j host bundleAttach the fragment to the log4j host bundle• Try it out!
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Spring Dynamic Modules in Action• Creating a Spring-powered bundleCreating a Spring-powered bundle• Importing and exporting services• The whiteboard pattern• Dynamics• Startup and shutdown
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.039
Services• Your application is constructed as a set of bundles• Your application is constructed as a set of bundles,
each with their own module context• How do we reference beans in other modules?
– use the OSGi Service Registry• advertise public services• import references to external services• import references to external services
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Beans and services
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Service import/export overviewExporting context:<bean id="printService"
class="com.springsource.osgi.print.internal.PrintServiceImpl"init-method="init"destroy-method="destroy"/>
<osgi:service ref="printService" interface="com.springsource.osgi.print.PrintService"/>
I ti t t<bean id="printClient"
class="com.springsource.osgi.print.client.Client"init-method="init">
Importing context:
t et od t<property name="printService" ref="printService"/>
</bean>
<osgi:reference id="printService"
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
interface="com.springsource.osgi.print.PrintService"/>
Exporting a service<bean id="printService"<bean id= printService
class="com.springsource.osgi.print.internal.PrintServiceImpl"init-method="init"destroy-method="destroy"/>
• any Spring bean can be exported as OSGi service
<osgi:service ref="printService" interface="com.springsource.osgi.print.PrintService"/>
y p g p• offers access to the ServiceRegistration object
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Importing a service<bean id="printClient" p
class="com.springsource.osgi.print.client.Client"init-method="init"><property name="printService" ref="printService"/>
</bean>
<osgi:reference id="printService" interface="com.springsource.osgi.print.PrintService"/>
• locates the best OSGi service that matches the description
• handles the service dynamics internally
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Demo/Exercise 3: OSGi services
• Step 1:• Step 1:Define an interface for your bean in a separate packageExport only this interface
• Step 2:Export your bean as an OSGi service using the interface
St 3• Step 3:Take a look at the available services at the console
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Demo/Exercise 3: OSGi services
• Step 4:• Step 4:Create another bundle including a spring contextDefine a bean that requires an instance of your service
Define the propertyImport the OSGi service as a bean
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Controlling Service Exporting
• Which interface(s) should the service be registered• Which interface(s) should the service be registered under?
a single interface, use the interface attributemultiple interfaces, use the nested interfaces elementOr... have Spring Dynamic Modules calculated the exported interface set for you automatically.
auto-export values are interfaces, class-hierarchy, or all-classes.
<osgi:service id="printService" auto-export="interfaces"/>
auto export values are interfaces, class hierarchy, or all classes.
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Controlling Service Exporting
• Service always has service property• Service always has service propertyorg.springframework.osgi.bean.name(set to bean name)
• Specify additional service properties explicitly if needed
<osgi:service ref="printService" interface="com.springsource.osgi.print.PrintService">
<osgi:service-properties><entry key="aKey" value="someValue"/><entry key="aKey" value-ref="someBeanName"/>
</osgi:service-properties></osgi:service properties></osgi:service>
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Controlling Service Importing
• Use filter expressions• Use filter expressionsRFC 1960: A String representation of LDAP Search Filters
<osgi:reference id="printService"<osgi:reference id="printService" interface="com.springsource.osgi.print.PrintService"filter="(colour=true)"/>
• Special attribute bean-name matches on org.springframework.osgi.bean.name property
f fcondition anded with filter expression if present
• Can specify multiple interfaces using nested interfaceselement.
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
e e e t
Spring Dynamic Modules in Action• Creating a Spring-powered bundleCreating a Spring-powered bundle• Importing and exporting services• The whiteboard pattern• Dynamics• Startup and shutdown
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.050
The Whiteboard Pattern
• “Listeners Considered Harmful: The Whiteboard• Listeners Considered Harmful: The Whiteboard Pattern”
OSGi Alliance Technical Whitepaper, 2004http://www.osgi.org/wiki/uploads/Links/whiteboard.pdf
• Lifecycle issues around listener registrationLifecycle issues around listener registration• Solution: whiteboard
event source is not registered as a servicelisteners register as services using well-known interfaceevent source uses a tracker to track listener services
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.051
Importing a set of services<bean id="printClient" p
class="com.springsource.osgi.print.client.Client"init-method="init"><property name="printService" ref="printService"/>
</bean>
<osgi:set id="printService" interface="com.springsource.osgi.print.PrintService"/>
• locates all OSGi services that match the description• handles the service dynamics internally• See also: <osgi:list... />
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Demo/Exercise 4: whiteboard pattern
• Step 1:• Step 1:Enhance your second bundle to use a set of servicesCall these services regularly
E.g. via a thread started in the init method
• Step 2:Split your first bundle into an interface bundle (containing justSplit your first bundle into an interface bundle (containing just the interface) and an implementation bundle
• Step 3:Create a third bundle that registers a different implementation of the interface as OSGi service
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Spring Dynamic Modules in Action• Creating a Spring-powered bundleCreating a Spring-powered bundle• Importing and exporting services• The whiteboard pattern• Dynamics• Startup and shutdown
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.054
Service interface typesexported [with versionA service bundle…
Dealing with dynamics
Export-Package: a.b.c
exported [with versioninformation]
private implementation
packagespackages
"Passive" contributionService implementationlocked away
Passive contribution• types added to type space• bundles see new version on
l ti ft i t ll/ f h
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
resolution after install/refresh
A service bundle…Dealing with dynamics
Published services
Private implementation "Active" contribution• services published in registry• bundles see service changes
Private implementationobjects
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
immediately
Service Dynamics• What happens when a service goes away?• What happens when a service goes away?
– osgi:reference cardinality=”0..1”• track replacement and retarget proxy when suitable target found• ServiceUnavailableException after timeout if invoked
– osgi:reference cardinality=”1..1”• as above, plus• unregister any exported services that depend on the unsatisfied
reference
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Cardinality (single reference)
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Registration management<osgi:service id="myService" ref="exposedBean"/>g y p
<bean id="exposedBean" class="..."><property name="myHelper" ref="helperBean"/>
</bean>
<bean id="helperBean" class="..."><property name="fooService" ref="fooService"/>
</bean>
<osgi:reference id="fooService" interface="..."/>
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Service Dynamics• What happens when a service goes away?• What happens when a service goes away?
– osgi:set/list cardinality=”0..n”• service is removed from the set• Iterator contract is honored
– osgi:set/list cardinality=”1..n”• as above, plus• unregister any exported services that depend on the unsatisfied
service reference
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Cardinality - many
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Demo/Exercise 5: Dynamics
• Play with the two implementation bundles via the• Play with the two implementation bundles via the console
Starting and stopping the different bundles and see what happens
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Listening• You work with a constant reference• You work with a constant reference
– Proxy / Set / List
• Spring Dynamic Modules manages the target backing p g y g g gservice(s) for you
• You can optionally listen to bind / unbind events• You can optionally listen to register / unregister events
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Reference listeners<osgi:reference id="printService"
interface="com.springsource.osgi.print.PrintService">
<osgi:listener bind-method="onBind"unbind-method="onUnbind">
<b b l "M C t Li t "/><beans:bean class="MyCustomListener"/></osgi:listener>
</osgi:reference>
class MyCustomListener {
public void onBind(PrintService service, Map serviceProperties) {...}
public void onBind(FastPrintService service, Map serviceProps) {...}
public void onUnbind(ColorPrintService service, Map props) {...}
}
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
}
Registration listeners<osgi:service id="printService"
interface="com.springsource.osgi.print.PrintService">
<osgi:registration-listener registration-method="registered"
i t ti th d " i t d"unregistration-method="unregistered"ref="printServiceListener"/>
</osgi:service>
class MyCustomListener {
public void registered(PrintService service, Map serviceProps) {...}
public void unregistered(PrintService service, Map serviceProps) {...}
}
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Spring Dynamic Modules in Action• Creating a Spring-powered bundleCreating a Spring-powered bundle• Importing and exporting services• The whiteboard pattern• Dynamics• Startup and shutdown
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.066
Startup• Context creation• Context creation
– blocks until all mandatory service references are satisfied– simply start your bundles and let Spring Dynamic Modules
figure it out• Control via Spring-Context manifest header directives
– wait-for-dependencies:=[true|false]– timeout:=[seconds]
• E.g.– Spring-Context: *;wait-for-dependencies:=falsep g ; p
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Shutdown
• Module contexts disposed when bundle is stopped• Module contexts disposed when bundle is stopped• Stopping the extender bundle disposes of all module contexts created by it
First those bundles that do not export any referenced services (in reverse bundle id order)Cycles broken first by ranking, then by service idy y g, y
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Agenda• What is Spring Dynamic Modules?• What is Spring Dynamic Modules?• Spring Dynamic Modules in Action• Server-side ApplicationsServer side Applications• RCP Applications• Summaryy
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.069
Server-side Applications• Options for using OSGi on the server-sideOptions for using OSGi on the server-side• Enterprise library "gotchas"• Context class loader management
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.070
Embedded OSGi
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
OSGi as a server platform
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Nested OSGi
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Enterprise Libraries under OSGi• class and resource-loading problems• class and resource-loading problems
– class visibility– Class.forName– context class loader
• Good news: Spring 2.5 is OSGi-readyd l hi d b dl– modules shipped as bundles
– all class loading behaves correctly under OSGi
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Example: Class visibility
Data LayerBundle
Import-Package Import-Package
Domain ModelBundle
<Export-Pkg>
HibernateBundle
<Export Pkg>domaint
g gtypes,mappingfiles SessionFactory
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Class visibility solutions
• Dynamic-ImportPackage• Dynamic-ImportPackagea last resort, too broad a scopedoes not affect module resolution
• Equinox Buddy PolicyIn Hibernate bundle manifest:
• Eclipse-BuddyPolicy : registered• Eclipse BuddyPolicy : registeredIn domain model bundle manifest:
• Eclipse-RegisterBuddy : org.hibernate• Import Package: org hibernate• Import-Package: org.hibernate
• Attach a Fragment BundleWith required Import-Package headers
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Class.forName
• Caches the returned• Caches the returned class in the initiating class loader
A D
– native, vm-level cache
• Can cause class loading errors
B
forName(...,CCL)
errors• Prefer
ClassLoader.loadClass C C'C C
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Context Class Loader
• Heavily used in enterprise Java• Heavily used in enterprise Java• Expected to have visibility of application types + classpath
• ContextClassLoader is undefined in OSGi!No notion of “context”; No notion of “application”
S l ti• Solutions:Eclipse Equinox: Context FinderSpring Dynamic Modules : CCL managementp g y g
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Context ClassLoader Management
• Context ClassLoader guaranteed to have visibility of• Context ClassLoader guaranteed to have visibility of bundle classpath when the module context for a bundle is created
• Control CCL on service invocation:client-side (attribute of reference element)
context-class-loader=”client|service-provider|unmanaged”context class loader client|service provider|unmanagedservice-side (attribute of service element)
context-class-loader=”service-provider|unmanaged”
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Web Applications• OSGi HttpService (Servlet 2 1 - 1998)• OSGi HttpService (Servlet 2.1 - 1998)
– registerServlets and resources under aliases– programmatic configuration
• Equinox Http Registry bundle– register servlets and resources using eclipse extension
registryregistry• OPS4J
– (http://wiki.ops4j.org/confluence/display/ops4j/Pax)Pax Web (Servlet 2 5 based on Jetty)– Pax Web (Servlet 2.5, based on Jetty)
– Pax Web Extender – War• Focus of Spring Dynamic Modules v1.1
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
The Spring DM 1.1 way…
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Web applications as Bundles
• “Regular” WAR files• “Regular” WAR files• Additional Bundle-Manifest
<context-param> Cl /
• web.xml shows how Spring DM is integrated
<param-name>contextClass</param-name> <param-value>org.springframework.osgi.web.context.support.OsgiBundleXmlWebApplicationContext</param-value>
</context-param>
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class> </listener>
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
</listener>
Spring DM Web Support by Example
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Demo/Exercise 6: Web front-end
• Step 1:• Step 1:Import the example projects into your workspace
• Step 2:pStart the server runtimeTake a look at the console
St 3• Step 3:Try out the web-front-end
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Agenda• What is Spring Dynamic Modules?• What is Spring Dynamic Modules?• Spring Dynamic Modules in Action• Server-side ApplicationsServer side Applications• RCP Applications• Summaryy
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.085
Pure RCP Client for a Spring Backend
• Server provides REST/SOAP services client• Server provides REST/SOAP services, client consumes via HTTP
• Server provides services via RMI, client consumes via
Application Server
p ,RMI
Application Server
Rich Client
usin
ess
ogic
and
ro
cess
ontr
ol
DataView
Sprin
g-xp
orte
rHTTP, RMI, …
ok
Bu
Lo PCoV S Ex
Eclipse RCP Spring
ok
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Evaluation
+Unrestricted usage of Spring on the server+Unrestricted usage of Spring on the server+Unrestricted usage of RCP on the client
−Different deployment and programming models(OSGi bundles on the client, typical WAR/EAR files on the server)
Good for highly decoupled systemsDifficult for more integrated systemsDifficult for more integrated systems
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
RCP & Spring on the Client, Spring Backend
• Uses Spring/Remoting for remote communication• Uses Spring/Remoting for remote communication• With all the possible variations (RMI, HTTPInvoker,
Hessian, Burlap, etc.)
Application Server
, p, )
Rich Client
Bus
ines
s Lo
gic
and
Proc
ess
Con
trol
DataView
Sprin
g-Ex
port
er
Sprin
g-Pr
oxyB
ean
ok
P
Eclipse RCP
SpringSpring
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Evaluation
+Unrestricted usage of Spring on the client and the+Unrestricted usage of Spring on the client and the server
+Unrestricted usage of RCP on the clientg+Easy remote communication via Spring/Remoting
−Still different deployment and programming models(OSGi bundles on the client, typical WAR/EAR files on the server)the server)
Although most likely classes are shared between client and server
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Spring & OSGi everywhere
• Equinox/OSGi can be used to implement middle tiers• Equinox/OSGi can be used to implement middle-tiersSame component model on both sidesSame extensibility for both sides
Application Server
• Client and server shares components
pp
Rich Client
Bus
ines
s Lo
gic
and
Proc
ess
Con
trol
DataView
Sprin
g-Ex
port
er
Sprin
g-Pr
oxyB
ean
ok
B LC EP
Equinox OSGi
SpringSpringEclipse RCP (UI-Part)
Equinox OSGi
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Evaluation
+ Full OSGi power on client and server+ Full OSGi power on client and server+ Full Spring power on client and server+Homogeneous programming model for client and+Homogeneous programming model for client and
server
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
More Spring on the Rich Client
• Dependency injection and all other technology• Dependency injection and all other technology abstractions usable as well
Just straight forward using Spring Dynamic Modules
• How to incorporate this with the Extension-Registry?F l i j t d d i i t i d dit ?For example, inject dependencies into views and editors?
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Alternative 1: Views with dependencies
• Define the view in the Spring context• Define the view in the Spring contextUsing Spring for dependency injection
• Define the Extension using an extension factoryg yWhich delegates the creation to the Spring context
+D d i j ti f l t i+Dependency injection for general extensions−Cumbersome manual programming for each
extension
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Alternative 2: Auto wiring
• Define the view in the Spring context• Define the view in the Spring contextUsing Spring for dependency injection
• Add a call to the auto wiring factory from the views g yconstructor
+Dependency injection for general extensions−Still some manual extra code for each extension
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Alternative 3: Spring-Extension-Bridge
• Define the view in the Spring context• Define the view in the Spring contextUsing Spring for dependency injection
• Define the SpringExtensionFactory as implementation p g y pclass in the extension (generic variant of alternative 1)
+Dependency injection for general extensions+No additional code+Easy to use+Easy to use−Need to change extension definition
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Alternative 4: @Configurable
• Define the view in the Spring context• Define the view in the Spring contextUsing Spring for dependency injection
• Add the @Configurable annotation to the view @ gimplementation
And use Equinox Aspects to load-time weave the spring aspects
+Dependency injection for general extensions+No additional code unchanged extensions+No additional code, unchanged extensions−Adds load-time weaving overhead−More difficult infrastructure setup
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
p
Demo: Spring-powered RCP
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Summary
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Summary
• OSGi: the dynamic module system for Java• OSGi: the dynamic module system for Java• Benefits: modularity, versioning, operational control• The server-side is coming to OSGig• Spring Dynamic Modules brings the familiar Spring
model to the OSGi platform• Enterprise application development path to be
smoothed during 2008e g SpringSource Application Platforme.g. SpringSource Application Platform
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Thank you for your attention
•Q&AQ&
• Martin Lippertli t@[email protected]
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Backup Materials
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Versioning• Packages are importedPackages are imported
optionally with version information
Can have multiple versions
YourApplication
• Can have multiple versions of same package concurrently Lib A Lib BLib A Lib B
Lib C v1 Lib C v2
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
Try it: versioning
Versioning Import-Package: org.osgi.framework;version="1.3.0",VersioningDemo
Import Package: org.osgi.framework;version 1.3.0 ,com.springsource.printing.lib;version="2.0",com.springsource.datetime
PrintingLib v2
Date/Time
Export-Package: com.springsource.datetimeImport-Package: com.springsource.printing.lib;Lib v2
Printing
Time
Export-Package: com.springsource.printing.lib;
i 2 0
version="[1.0.0,2.0.0)"
Lib v1version="2.0"
Export-Package: com springsource printing lib;
Spring + OSGi = Spring Dynamic Modules | Tutorial | © 2008 by Martin Lippert, BJ Hargrave, Adrian Colyer; made available under the EPL v1.0
com.springsource.printing.lib;version="1.0"