OSGi
Declarative Services versus
 Spring Dynamic Modules


                                                      Heiko See...
Agenda

» Demo: A Swing App Framework based dynamic OSGi application
» OSGi Services
      » Providing and consuming Servi...
Demo




                                                              © Kai Tödter, Heiko Seeberger
3   Licensed under Cr...
How to get the Demo?

» The PM Demo project home page is:
  http://max-server.myftp.org/trac/pm
» There you find
      » W...
Agenda

» Demo: A Swing App Framework based dynamic OSGi application
» OSGi Services
      » Providing and consuming Servi...
OSGi is Service-Oriented!




                                                                     © Kai Tödter, Heiko See...
Providing a Service (1)



                                   Service
                                   Registry
    << r...
Providing a Service (2)

» An OSGi service is a POJO ...
» ... registered under one ore more service interface names ...
»...
Consuming a Service (1)




                             Service
                             Registry
                   ...
Consuming a Service (2)

» First a service reference is looked-up by the Service Interface name
» Second the service objec...
How to deal with Service Dynamics?




                                                                      © Kai Tödter,...
Services might come and go

» Service Look-ups might fail, because ...
       » ... bundle(s) providing service not starte...
Service Listeners ...

» ... will receive all service events
       » REGISTERED, MODIFIED, UNREGISTERING
» ... or a filte...
Dynamic Services are difficult to handle (1)


                                  Typical task:
              Track all ser...
Dynamic Services are difficult to handle (2)

» Alternative solution: Reverse the steps
       » (1) First register a Serv...
The Service Tracker

» Utility class specified in OSGi Service Compendium
       » Package: “org.osgi.util.tracker”
      ...
Services in very dynamic Scenarios

» Programmatic use of dynamic services works, but has some
  drawbacks:
       » Eager...
Agenda

» Demo: A Swing App Framework based dynamic OSGi application
» OSGi Services
       » Providing and consuming Serv...
Overview DS & DM

» The next 4 slides show just a very brief overview and examples
» Details follow in the rest of this pr...
Declarative Services (DS)

» DS is part of the OSGi R4 spec (Service Compendium)
» DS let you declare components in XML
» ...
PM Example DS Component

<component name=quot;pm.ui.actions.person.ActionContributionquot;>
      <implementation
        ...
Spring Dynamic Modules (DM)

» Integration of Spring DI and OSGi
» XML files are placed in META-INF/spring directory, usua...
PM Example Spring DM Component

XML for Spring Bean:
<beans (schema attributes omitted)>
  <bean name=quot;savePersonquot;...
Agenda

» Demo: A Swing App Framework based dynamic OSGi application
» OSGi Services
       » Providing and consuming Serv...
Service Component Runtime

» Providing a service means
      1. Providing an implementation of a service interface
      2...
Needed OSGi Bundles

To run DS with Equinox, the following bundles are needed:


» org.eclipse.osgi
» org.eclipse.osgi.ser...
DS Components


                   Provides Services
     optional


     Component
                                      ...
Component Activation

» Lazy Activation (Delayed Component)
      » All dependencies must be resolved
      » On first req...
Component Activation (1)




                     Create
     Load          Component
                                    ...
Component Activation (2)

» Component Instance class needs a default constructor
» activate() and deactivate() may be supp...
Defining a DS Component

» The <component>.xml file
      » Has to be placed in a directory OSGI-INF
      » Contains the ...
Services and Properties

» Specify the interface the component implements as a service, e.g.
       <service>
          <p...
Defining References

» DS uses dependency injection for references to other services
» The SCR resolves all the references...
Reference Cardinality


Cardinality        Meaning
                   Unary and optional
0..1
1..1               Unary and...
Accessing Services – Event Strategy

» On (un)binding a referenced service a (un)bind method is called
» Methods are found...
Reference Policy

» How does unbinding of target services influence the life cycle?
» Static policy:
       » Service Comp...
DS Conclusion

+ Very easy to define components, services and references
  declaratively
+ SCR takes care of life cycle ma...
Agenda

» Demo: A Swing App Framework based dynamic OSGi application
» OSGi Services
       » Providing and consuming Serv...
Spring Dependency Injection

» Application Context: Lightweight container
» Beans: Non-invasive programming model
» Depend...
What is Spring DM?




     Spring Dynamic Modules focuses on integrating Spring
     Framework powerful, non-invasive pro...
Spring DM at a Glance




                                                                     © Kai Tödter, Heiko Seeberg...
Applying the Extender Model




                                                                        © Kai Tödter, Heik...
The Spring-Context Manifest Header




                                                                           © Kai Tö...
Application Context Creation


       Directive                                           Effect
create-asynchronously   C...
Exporting Beans as OSGi Services (1)




        <service ref=quot;...quot; interface=quot;...quot;>




                 ...
Exporting Beans as OSGi Services (2)


  service Attributes                                   Meaning
ref                 ...
Importing Beans as OSGi Services (1)




<reference id=quot;...quot; interface=quot;...quot; cardinality=quot;...quot;>

 ...
Importing Beans as OSGi Services (2)


         Attributes                                   Meaning
id                   ...
And what about Service Dynamics?

» ServiceUnavailableException for invocations on stale references
» Unary references (re...
Listening to Service Events




     <reference id=quot;...quot; interface=quot;...quot;>
       <listener bind-method=quo...
Needed OSGi Bundles

To run Spring DM the following additional bundles are needed:
» spring-osgi-core-1.1.2.jar
» spring-o...
Spring DM Conclusion

+ Very easy to define Spring beans, OSGi services and references
  declaratively
+ Spring DM takes c...
Agenda

» Demo: A Swing App Framework based dynamic OSGi application
» OSGi Services
       » Providing and consuming Serv...
DS versus DM

Topic                                                                 OSGi DS                   Spring DM
Ea...
Conclusion & Recommendation

» We recommend to use either DS or DM rather than manually
  programming all the service infr...
Further Information

» OSGi Alliance Specifications: Service Compendium,
     112 Declarative Services Specification
     ...
Discussion




                                                               © Kai Tödter, Heiko Seeberger
57   Licensed ...
Upcoming SlideShare
Loading in …5
×

W-JAX 08 - Declarative Services versus Spring Dynamic Modules

2,547 views

Published on

Declarative Services versus Spring Dynamic Modules

Published in: Technology, Education
1 Comment
4 Likes
Statistics
Notes
  • Nice structured presentation on the difference between spring dm and ds
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
2,547
On SlideShare
0
From Embeds
0
Number of Embeds
9
Actions
Shares
0
Downloads
86
Comments
1
Likes
4
Embeds 0
No embeds

No notes for slide

W-JAX 08 - Declarative Services versus Spring Dynamic Modules

  1. 1. OSGi Declarative Services versus Spring Dynamic Modules Heiko Seeberger WeigleWilczek Kai Tödter Siemens Corporate Technology © Kai Tödter, Heiko Seeberger Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  2. 2. Agenda » Demo: A Swing App Framework based dynamic OSGi application » OSGi Services » Providing and consuming Services » Service Tracker » Overview Declarative Services & Spring Dynamic Modules » Declarative Services in Detail » Spring Dynamic Modules in Detail » Comparison (DS vs. DM) » Conclusion & Best Practices » Discussion © Kai Tödter, Heiko Seeberger 2 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  3. 3. Demo © Kai Tödter, Heiko Seeberger 3 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  4. 4. How to get the Demo? » The PM Demo project home page is: http://max-server.myftp.org/trac/pm » There you find » Wiki with some documentation » Anonymous Subversion access » Trac issue tracking » Licenses » All PM project sources are licensed under EPL » Swing Application Framework (JSR 296) implementation is licensed under LGPL » Swing Worker is licensed under LGPL » The nice icons from FamFamFam are licensed under the Creative Commons Attribution 2.5 License © Kai Tödter, Heiko Seeberger 4 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  5. 5. Agenda » Demo: A Swing App Framework based dynamic OSGi application » OSGi Services » Providing and consuming Services » Service Tracker » Overview Declarative Services & Spring Dynamic Modules » Declarative Services in Detail » Spring Dynamic Modules in Detail » Comparison (DS vs. DM) » Conclusion & Best Practices » Discussion © Kai Tödter, Heiko Seeberger 5 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  6. 6. OSGi is Service-Oriented! © Kai Tödter, Heiko Seeberger 6 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  7. 7. Providing a Service (1) Service Registry << register >> POJO << implement >> Service Service Interface Properties © Kai Tödter, Heiko Seeberger 7 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  8. 8. Providing a Service (2) » An OSGi service is a POJO ... » ... registered under one ore more service interface names ... » ... and optional service properties BundleContext + registerService(String, Object, Dictionary): ServiceRegistration + registerService(String[], Object, Dictionary): ServiceRegistration © Kai Tödter, Heiko Seeberger 8 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  9. 9. Consuming a Service (1) Service Registry << look-up >> Service POJO Reference << implement >> Service Service Interface Properties © Kai Tödter, Heiko Seeberger 9 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  10. 10. Consuming a Service (2) » First a service reference is looked-up by the Service Interface name » Second the service object is obtained using the Service Reference » The Service Registry keeps track of obtained service objects » When no longer needed, a service object must be returned BundleContext + getServiceReference(String): ServiceReference + getService(ServiceReference): Object + ungetService(ServiceReference): boolean © Kai Tödter, Heiko Seeberger 10 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  11. 11. How to deal with Service Dynamics? © Kai Tödter, Heiko Seeberger Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  12. 12. Services might come and go » Service Look-ups might fail, because ... » ... bundle(s) providing service not started yet » ... service(s) not registered yet » ... bundle(s) providing service stopped » ... Best practice: Better listen to service events than looking up services. © Kai Tödter, Heiko Seeberger 12 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  13. 13. Service Listeners ... » ... will receive all service events » REGISTERED, MODIFIED, UNREGISTERING » ... or a filtered subset BundleContext + addServiceListener(ServiceListener): void + addServiceListener(ServiceListener, String): void © Kai Tödter, Heiko Seeberger 13 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  14. 14. Dynamic Services are difficult to handle (1) Typical task: Track all services of a certain type, i.e. all that are already there as well as all that will come and go. » Possible solution: » (1) Frist look-up all existing services » (2) Then register a Service Listener to stay tuned » Problem: Possibility to miss out on some services registered or unregistered between (1) and (2) © Kai Tödter, Heiko Seeberger 14 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  15. 15. Dynamic Services are difficult to handle (2) » Alternative solution: Reverse the steps » (1) First register a Service Listener to stay tuned » (2) Then look-up all existing services » Problem: Watch out for duplication! Best practice: Service Listeners are low-level and their usage is error-prone. Better use Service Trackers. © Kai Tödter, Heiko Seeberger 15 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  16. 16. The Service Tracker » Utility class specified in OSGi Service Compendium » Package: “org.osgi.util.tracker” » Based on Service Listeners and “a lot of knowledge” » Services to be tracked may be specified by ... » ... a Service Interface name » ... a filter » Must be opened to start and closed to stop tracking » Handles service events via the methods » addingService() » modifiedService() » removedService() © Kai Tödter, Heiko Seeberger 16 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  17. 17. Services in very dynamic Scenarios » Programmatic use of dynamic services works, but has some drawbacks: » Eager creation of services leads to » Large memory footprint » Long startup time » Increasing complexity with decreasing robustness » But is there anything out there that helps here? » Yes, services and dependencies can be specified declaratively! » Declarative Services » Spring Dynamic Modules » Others (e.g. iPOJO) © Kai Tödter, Heiko Seeberger 17 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  18. 18. Agenda » Demo: A Swing App Framework based dynamic OSGi application » OSGi Services » Providing and consuming Services » Service Tracker » Overview Declarative Services & Spring Dynamic Modules » Declarative Services in Detail » Spring Dynamic Modules in Detail » Comparison (DS vs. DM) » Conclusion & Best Practices » Discussion © Kai Tödter, Heiko Seeberger 18 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  19. 19. Overview DS & DM » The next 4 slides show just a very brief overview and examples » Details follow in the rest of this presentation © Kai Tödter, Heiko Seeberger 19 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  20. 20. Declarative Services (DS) » DS is part of the OSGi R4 spec (Service Compendium) » DS let you declare components in XML » The declarations live in OSGI-INF/<component>.xml » Components can provide services » Components can depend on other services » Dependency injection for references to other services: » References may be bound to bind()-/unbind()-methods in components » A cardinality and a creation policy can be defined » Components need the bundle manifest header Service-Component e.g. Service-Component: OSGI-INF/personManager.xml © Kai Tödter, Heiko Seeberger 20 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  21. 21. PM Example DS Component <component name=quot;pm.ui.actions.person.ActionContributionquot;> <implementation class=quot;pm.ui.actions.person.ActionContributionquot;/> <service> <provide interface= quot;pm.application.service.IActionContributionquot;/> </service> <reference name=quot;PersonManagerquot; interface=quot;pm.model.IPersonManagerquot; bind=quot;setPersonManagerquot; unbind=quot;removePersonManagerquot; cardinality=quot;0..1quot; policy=quot;dynamicquot;/> </component> © Kai Tödter, Heiko Seeberger 21 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  22. 22. Spring Dynamic Modules (DM) » Integration of Spring DI and OSGi » XML files are placed in META-INF/spring directory, usually » One XML file to define a Spring bean » One XML file to map this bean to an OSGi service » Uses Spring dependency injection for references to other services and POJOs » Similar but more flexible/powerful approach compared with DS » But needs around 12 additional Spring and logging bundles to run © Kai Tödter, Heiko Seeberger 22 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  23. 23. PM Example Spring DM Component XML for Spring Bean: <beans (schema attributes omitted)> <bean name=quot;savePersonquot; class=quot;pm.ui.actions.save.ActionContributionquot;/> </beans> XML for OSGi service mapping: <beans (schema attributes omitted)> <osgi:service id=quot;savePersonOSGiquot; ref=quot;savePersonquot; interface=quot;pm.application.service.IActionContributionquot;/> </beans> © Kai Tödter, Heiko Seeberger 23 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  24. 24. Agenda » Demo: A Swing App Framework based dynamic OSGi application » OSGi Services » Providing and consuming Services » Service Tracker » Overview Declarative Services & Spring Dynamic Modules » Declarative Services in Detail » Spring Dynamic Modules in Detail » Comparison (DS vs. DM) » Conclusion & Best Practices » Discussion © Kai Tödter, Heiko Seeberger 24 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  25. 25. Service Component Runtime » Providing a service means 1. Providing an implementation of a service interface 2. Register the implementation with the service registry » In programmatic approaches, this is usually done by the same bundle » In DS, the Service Component Runtime (SCR) takes care of » Registering/Unregistering the service implementation » Managing the lifecycle » DS introduces the notion of a Component that » Can provide services » Can depend on other services © Kai Tödter, Heiko Seeberger 25 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  26. 26. Needed OSGi Bundles To run DS with Equinox, the following bundles are needed: » org.eclipse.osgi » org.eclipse.osgi.services » org.eclipse.equinox.ds » org.eclipse.equinox.util © Kai Tödter, Heiko Seeberger 26 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  27. 27. DS Components Provides Services optional Component Component Description Instance (XML) (POJO) optional Depends on Service References © Kai Tödter, Heiko Seeberger 27 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  28. 28. Component Activation » Lazy Activation (Delayed Component) » All dependencies must be resolved » On first request of the service interface the component is activated » This is the default behavior for components providing services » Eager Activation (Immediate Component): » As all dependencies can be resolved the component is created » This is expressed in XML by the component attribute immediate=quot;truequot; » This should be used only if there is a good reason for! » All components not providing services must be immediate components! © Kai Tödter, Heiko Seeberger 28 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  29. 29. Component Activation (1) Create Load Component Bind target Call activate() Instance and Component services if present Component Instance class Context © Kai Tödter, Heiko Seeberger 29 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  30. 30. Component Activation (2) » Component Instance class needs a default constructor » activate() and deactivate() may be supplied » Methods are found by reflection » May also be defined in super classes protected void activate(ComponentContext context) protected void deactivate(ComponentContext context) © Kai Tödter, Heiko Seeberger 30 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  31. 31. Defining a DS Component » The <component>.xml file » Has to be placed in a directory OSGI-INF » Contains the XML code <component name=quot;ct...person.ActionContributionquot;> <implementation class=quot;ct...person.ActionContributionquot;/> </component> » Optional component attributes » immediate: if set true, the component is activated eagerly » Optional tags (see next slides) » service » reference » Components need the bundle manifest header Service-Component e.g. Service-Component: OSGI-INF/<component>.xml © Kai Tödter, Heiko Seeberger 31 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  32. 32. Services and Properties » Specify the interface the component implements as a service, e.g. <service> <provide interface= quot;pm.application.service.IActionContributionquot;/> </service> » Also properties can be defined declaratively, e.g. <property name=quot;action.namequot; type=quot;Stringquot; value=quot;SavePersonActionquot;/> » The defined service will have the component’s properties © Kai Tödter, Heiko Seeberger 32 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  33. 33. Defining References » DS uses dependency injection for references to other services » The SCR resolves all the references automatically » Only, if all references with respect to the cardinality (see next slide) can be resolved, the component will be activated <reference name=quot;PersonManagerquot; interface=quot;pm.model.IPersonManager“ ... /> © Kai Tödter, Heiko Seeberger 33 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  34. 34. Reference Cardinality Cardinality Meaning Unary and optional 0..1 1..1 Unary and mandatory 0..n Multiple and optional 1..n Multiple and mandatory Example <reference name=quot;PersonManagerquot; ... cardinality=quot;0..1quot; /> © Kai Tödter, Heiko Seeberger 34 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  35. 35. Accessing Services – Event Strategy » On (un)binding a referenced service a (un)bind method is called » Methods are found by reflection » Method names are specified in XML <reference name=quot;PersonManagerquot; ... bind=quot;setPersonManagerquot; unbind=quot;removePersonManagerquot; … /> » Parameters for bind/unbind method may be the service type or a ServiceReference, e.g. public synchronized void setPersonManager(IPersonManager personManager) © Kai Tödter, Heiko Seeberger 35 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  36. 36. Reference Policy » How does unbinding of target services influence the life cycle? » Static policy: » Service Component is deactivated and ... » ... activated again if other service(s) available » Dynamic policy: » Life cycle is not affected, as long as references are satisfied <reference name=quot;PersonManagerquot; … policy=quot;dynamicquot;/> © Kai Tödter, Heiko Seeberger 36 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  37. 37. DS Conclusion + Very easy to define components, services and references declaratively + SCR takes care of life cycle management and dependency resolution But  Dependency injection only works for other services, not for POJOs or DS components  Properties cannot be declared mandatory © Kai Tödter, Heiko Seeberger 37 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  38. 38. Agenda » Demo: A Swing App Framework based dynamic OSGi application » OSGi Services » Providing and consuming Services » Service Tracker » Overview Declarative Services & Spring Dynamic Modules » Declarative Services in Detail » Spring Dynamic Modules in Detail » Comparison (DS vs. DM) » Conclusion & Best Practices » Discussion © Kai Tödter, Heiko Seeberger 38 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  39. 39. Spring Dependency Injection » Application Context: Lightweight container » Beans: Non-invasive programming model » Dependency Injection © Kai Tödter, Heiko Seeberger 39 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  40. 40. What is Spring DM? Spring Dynamic Modules focuses on integrating Spring Framework powerful, non-invasive programming model and concepts with the dynamics and modularity of OSGi platform. It allows transparent exporting and importing of OSGi services, life cycle management and control. (Spring DM Ref. Guide, 1.0) © Kai Tödter, Heiko Seeberger 40 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  41. 41. Spring DM at a Glance © Kai Tödter, Heiko Seeberger 41 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  42. 42. Applying the Extender Model © Kai Tödter, Heiko Seeberger 42 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  43. 43. The Spring-Context Manifest Header © Kai Tödter, Heiko Seeberger 43 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  44. 44. Application Context Creation Directive Effect create-asynchronously Create asynchronously as to OSGi thread? Default is true wait-for-dependencies Wait for mandatory dependencies? Default is true timeout Time in seconds to wait for mandatory dependencies before failing. Default is 300 publish-context Publish the Application Context as OSGi service? Default is true © Kai Tödter, Heiko Seeberger 44 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  45. 45. Exporting Beans as OSGi Services (1) <service ref=quot;...quot; interface=quot;...quot;> © Kai Tödter, Heiko Seeberger 45 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  46. 46. Exporting Beans as OSGi Services (2) service Attributes Meaning ref Bean to be exported as OSGi service interface FQCN of service interface. Alternatives: auto-export or interfaces sub- element auto-export Automatically manage service interfaces. disabled, interfaces, class-hierarchy, all-classes ranking Service property service.ranking © Kai Tödter, Heiko Seeberger 46 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  47. 47. Importing Beans as OSGi Services (1) <reference id=quot;...quot; interface=quot;...quot; cardinality=quot;...quot;> <set|list id=quot;...quot; interface=quot;...quot; cardinality=quot;...quot;> © Kai Tödter, Heiko Seeberger 47 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  48. 48. Importing Beans as OSGi Services (2) Attributes Meaning id Name of bean for referenced OSGi service interface FQCN of service interface. Alternative: interfaces sub-element filter OSGi filter expression to constrain service look-up cardinality reference: 0..1, 1..1 set|list: 0..N, 1..N © Kai Tödter, Heiko Seeberger 48 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  49. 49. And what about Service Dynamics? » ServiceUnavailableException for invocations on stale references » Unary references (reference) are dynamic-aware » Re-binding with matching service when bound service goes away » Multiple references (set|list) are dynamic-aware » Collections and Iterators always up-to-date with service registry » Services with unsatisfied references are unregistered … » … and re-registered when satisfied again © Kai Tödter, Heiko Seeberger 49 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  50. 50. Listening to Service Events <reference id=quot;...quot; interface=quot;...quot;> <listener bind-method=quot;...quot; unbind-method=quot;...quot;> <beans:bean class=quot;...quot;/> ... © Kai Tödter, Heiko Seeberger 50 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  51. 51. Needed OSGi Bundles To run Spring DM the following additional bundles are needed: » spring-osgi-core-1.1.2.jar » spring-osgi-extender-1.1.2.jar » spring-osgi-io-1.1.2.jar » com.springsource.org.aopalliance-1.0.0.jar » spring-aop-2.5.5.jar » spring-beans-2.5.5.jar » spring-context-2.5.5.jar » spring-core-2.5.5.jar » com.springsource.slf4j.api-1.5.0.jar » com.springsource.slf4j.log4j-1.5.0.jar » com.springsource.slf4j.org.apache.commons.logging-1.5.0.jar » log4j.osgi-1.2.15-SNAPSHOT.jar © Kai Tödter, Heiko Seeberger 51 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  52. 52. Spring DM Conclusion + Very easy to define Spring beans, OSGi services and references declaratively + Spring DM takes care of life cycle management and dependency resolution + Very powerful Dependency Injection But  Properties also cannot be declared mandatory © Kai Tödter, Heiko Seeberger 52 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  53. 53. Agenda » Demo: A Swing App Framework based dynamic OSGi application » OSGi Services » Providing and consuming Services » Service Tracker » Overview Declarative Services & Spring Dynamic Modules » Declarative Services in Detail » Spring Dynamic Modules in Detail » Comparison (DS vs. DM) » Conclusion & Best Practices » Discussion © Kai Tödter, Heiko Seeberger 53 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  54. 54. DS versus DM Topic OSGi DS Spring DM Ease of use ++ + Reducing complexity + ++ Lazy service activation/creation ++ -- Compatible with procedural OSGi service model ++ ++ Dependency Injection of Services + + Dependency Injection of POJOs -- ++ Current tooling support + + © Kai Tödter, Heiko Seeberger 54 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  55. 55. Conclusion & Recommendation » We recommend to use either DS or DM rather than manually programming all the service infrastructure and life cycles » If the capabilities of DS are ok with you (or lazy activation is important), use DS » If you need DI or want to use Spring anyway, use Spring DM © Kai Tödter, Heiko Seeberger 55 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  56. 56. Further Information » OSGi Alliance Specifications: Service Compendium, 112 Declarative Services Specification » Component Description schema detailed » Enabling Service Components » Factory Components » Spring Dynamic Modules » Other Service Component models » Apache Felix iPOJO © Kai Tödter, Heiko Seeberger 56 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License
  57. 57. Discussion © Kai Tödter, Heiko Seeberger 57 Licensed under Creative Commons Attribution-Noncommercial-NoDerivs 2.0 Germany License

×