0
When is ‘optional’ really optional?
http://www.paremus.com
info@paremus.com

Tim Ward
When is ‘optional’ really optional?
...
Who is Tim Ward?
@TimothyWard

• Senior Consulting Engineer and Architect at Paremus
• 5 years at IBM developing WebSphere...
Optional Services

When is ‘optional’ really optional?

Tuesday, 29 October 13

Copyright © 2005 - 2013 Paremus Ltd.
May n...
Optional Services

• OSGi bundles communicate and collaborate using loosely coupled services
• Making a service dependency...
Difficulties with Optional Services

• The OSGi API and DS need null checks, which is messy
• Blueprint injects a proxy to...
Blueprint is the winner! Or is it?

When is ‘optional’ really optional?

Tuesday, 29 October 13

Copyright © 2005 - 2013 P...
Blueprint is the winner! Or is it?

• At first inspection Blueprint looks much simpler

When is ‘optional’ really optional?...
Blueprint is the winner! Or is it?

• At first inspection Blueprint looks much simpler
• But what happens when there is no ...
Blueprint is the winner! Or is it?

• At first inspection Blueprint looks much simpler
• But what happens when there is no ...
Blueprint is the winner! Or is it?

• At first inspection Blueprint looks much simpler
• But what happens when there is no ...
Blueprint is the winner! Or is it?

• At first inspection Blueprint looks much simpler
• But what happens when there is no ...
Blueprint is the winner! Or is it?

• At first inspection Blueprint looks much simpler
• But what happens when there is no ...
Blueprint is the winner! Or is it?

• At first inspection Blueprint looks much simpler
• But what happens when there is no ...
Blueprint 1.1 to the rescue

When is ‘optional’ really optional?

Tuesday, 29 October 13

Copyright © 2005 - 2013 Paremus ...
Blueprint 1.1 to the rescue

• Despite aiming to be “simple” Blueprint 1.0 sucked at optionality...

When is ‘optional’ re...
Blueprint 1.1 to the rescue

• Despite aiming to be “simple” Blueprint 1.0 sucked at optionality...
• Blueprint 1.1 propos...
Blueprint 1.1 to the rescue

• Despite aiming to be “simple” Blueprint 1.0 sucked at optionality...
• Blueprint 1.1 propos...
Blueprint 1.1 to the rescue

• Despite aiming to be “simple” Blueprint 1.0 sucked at optionality...
• Blueprint 1.1 propos...
Blueprint 1.1 to the rescue

• Despite aiming to be “simple” Blueprint 1.0 sucked at optionality...
• Blueprint 1.1 propos...
Blueprint 1.1 to the rescue

• Despite aiming to be “simple” Blueprint 1.0 sucked at optionality...
• Blueprint 1.1 propos...
Blueprint 1.1 to the rescue

• Despite aiming to be “simple” Blueprint 1.0 sucked at optionality...
• Blueprint 1.1 propos...
Blueprint 1.1 to the rescue

• Despite aiming to be “simple” Blueprint 1.0 sucked at optionality...
• Blueprint 1.1 propos...
Is Service Optionality really ‘optional’

When is ‘optional’ really optional?

Tuesday, 29 October 13

Copyright © 2005 - ...
Is Service Optionality really ‘optional’

• The optionality so far has made an implicit assumption

When is ‘optional’ rea...
Is Service Optionality really ‘optional’

• The optionality so far has made an implicit assumption
• The API was not optio...
Is Service Optionality really ‘optional’

• The optionality so far has made an implicit assumption
• The API was not optio...
Is Service Optionality really ‘optional’

• The optionality so far has made an implicit assumption
• The API was not optio...
Is Service Optionality really ‘optional’

• The optionality so far has made an implicit assumption
• The API was not optio...
Is Service Optionality really ‘optional’

• The optionality so far has made an implicit assumption
• The API was not optio...
Optional Packages

When is ‘optional’ really optional?

Tuesday, 29 October 13

Copyright © 2005 - 2013 Paremus Ltd.
May n...
Handling Package Optionality

When is ‘optional’ really optional?

Tuesday, 29 October 13

Copyright © 2005 - 2013 Paremus...
Handling Package Optionality

• Having optional package imports makes OSGi more like a normal classpath

When is ‘optional...
Handling Package Optionality

• Having optional package imports makes OSGi more like a normal classpath
• You need to be d...
Handling Package Optionality

• Having optional package imports makes OSGi more like a normal classpath
• You need to be d...
Handling Package Optionality

• Having optional package imports makes OSGi more like a normal classpath
• You need to be d...
Handling Package Optionality

• Having optional package imports makes OSGi more like a normal classpath
• You need to be d...
Handling Package Optionality

• Having optional package imports makes OSGi more like a normal classpath
• You need to be d...
Handling Package Optionality (2)

When is ‘optional’ really optional?

Tuesday, 29 October 13

Copyright © 2005 - 2013 Par...
Handling Package Optionality (2)

• Optional packages can be very hard to manage

When is ‘optional’ really optional?

Tue...
Handling Package Optionality (2)

• Optional packages can be very hard to manage
• Having multiple optional dependencies c...
Handling Package Optionality (2)

• Optional packages can be very hard to manage
• Having multiple optional dependencies c...
Handling Package Optionality (2)

• Optional packages can be very hard to manage
• Having multiple optional dependencies c...
Handling Package Optionality (2)

• Optional packages can be very hard to manage
• Having multiple optional dependencies c...
Handling Package Optionality (2)

• Optional packages can be very hard to manage
• Having multiple optional dependencies c...
Handling Package Optionality (2)

• Optional packages can be very hard to manage
• Having multiple optional dependencies c...
Thanks!

• For more about OSGi...
• Specifications at http://www.osgi.org
• Enterprise OSGi in Action
• http://www.manning....
Upcoming SlideShare
Loading in...5
×

When is 'optional' really optional? - Tim Ward

386

Published on

OSGi Community Event 2013 (http://www.osgi.org/CommunityEvent2013/Schedule)

Lightning Talk

ABSTRACT
OSGi has an excellent, flexible dependency model and enables loosely coupled interactions between bundles via the service registry. Most of the time this is easy to reason about, but having optional dependencies can sometimes lead to surprising results. This talk will highlight the issues you might come across if you start playing with optional dependencies.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
386
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
10
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "When is 'optional' really optional? - Tim Ward"

  1. 1. When is ‘optional’ really optional? http://www.paremus.com info@paremus.com Tim Ward When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  2. 2. Who is Tim Ward? @TimothyWard • Senior Consulting Engineer and Architect at Paremus • 5 years at IBM developing WebSphere Application Server • Container Implementation experience with Java EE and OSGi, including Blueprint, JPA, EJB and JTA • OSGi Specification lead for JPA and Bytecode Weaving • PMC member of the Apache Aries project • Previous speaker at EclipseCon, Devoxx, Jazoon, JAX London, OSGi Community Event... • Author of Manning’s Enterprise OSGi in Action • http://www.manning.com/cummins When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  3. 3. Optional Services When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  4. 4. Optional Services • OSGi bundles communicate and collaborate using loosely coupled services • Making a service dependency “optional” is pretty easy OSGi API ServiceReference<Foo> ref = ctx .getServiceReference(Foo.class); Declarative Services API private Foo fooService; @Reference(cardinality = OPTIONAL) public synchronized void setFoo(Foo service) { fooService = service; } if(ref != null) { Foo service = ctx.getService(ref); if(service != null) { try { ... public synchronized void unsetFoo(Foo service) { } finally { fooService = (fooService == service) ? null : ctx.ungetService(ref); service; } } } Copyright © 2005 - 2013 Paremus Ltd. Oct 2013 } When is ‘optional’ really optional? May not be reproduced by any means without express permission. All rights reserved. Tuesday, 29 October 13
  5. 5. Difficulties with Optional Services • The OSGi API and DS need null checks, which is messy • Blueprint injects a proxy to the service - No more nulls! Blueprint code Blueprint XML private Foo fooService; <blueprint> public void setFoo(Foo service) { fooService = service; } <reference interface=com.paremus.Foo id=”foo” availability=”optional”/> <bean id=”bar” class=”com.paremus.Bar> <property name=”foo” ref=”foo”> </bean> </blueprint> When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  6. 6. Blueprint is the winner! Or is it? When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  7. 7. Blueprint is the winner! Or is it? • At first inspection Blueprint looks much simpler When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  8. 8. Blueprint is the winner! Or is it? • At first inspection Blueprint looks much simpler • But what happens when there is no backing service? When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  9. 9. Blueprint is the winner! Or is it? • At first inspection Blueprint looks much simpler • But what happens when there is no backing service? • Calling an unbound blueprint service proxy blocks up to the “timeout”. If no service arrives then you get a ServiceUnavailableException When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  10. 10. Blueprint is the winner! Or is it? • At first inspection Blueprint looks much simpler • But what happens when there is no backing service? • Calling an unbound blueprint service proxy blocks up to the “timeout”. If no service arrives then you get a ServiceUnavailableException • The default timeout is 5 minutes!!! When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  11. 11. Blueprint is the winner! Or is it? • At first inspection Blueprint looks much simpler • But what happens when there is no backing service? • Calling an unbound blueprint service proxy blocks up to the “timeout”. If no service arrives then you get a ServiceUnavailableException • The default timeout is 5 minutes!!! • You can decrease the timeout (but not to zero) When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  12. 12. Blueprint is the winner! Or is it? • At first inspection Blueprint looks much simpler • But what happens when there is no backing service? • Calling an unbound blueprint service proxy blocks up to the “timeout”. If no service arrives then you get a ServiceUnavailableException • The default timeout is 5 minutes!!! • You can decrease the timeout (but not to zero) • You can use a ReferenceListener (this is horrible code, and risks deadlock) When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  13. 13. Blueprint is the winner! Or is it? • At first inspection Blueprint looks much simpler • But what happens when there is no backing service? • Calling an unbound blueprint service proxy blocks up to the “timeout”. If no service arrives then you get a ServiceUnavailableException • The default timeout is 5 minutes!!! • You can decrease the timeout (but not to zero) • You can use a ReferenceListener (this is horrible code, and risks deadlock) • You can inject a ReferenceList (like DS, but with the wrong cardinality) When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  14. 14. Blueprint 1.1 to the rescue When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  15. 15. Blueprint 1.1 to the rescue • Despite aiming to be “simple” Blueprint 1.0 sucked at optionality... When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  16. 16. Blueprint 1.1 to the rescue • Despite aiming to be “simple” Blueprint 1.0 sucked at optionality... • Blueprint 1.1 proposes several fixes: When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  17. 17. Blueprint 1.1 to the rescue • Despite aiming to be “simple” Blueprint 1.0 sucked at optionality... • Blueprint 1.1 proposes several fixes: • Allow users to have an immediate timeout (no service, no waiting) When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  18. 18. Blueprint 1.1 to the rescue • Despite aiming to be “simple” Blueprint 1.0 sucked at optionality... • Blueprint 1.1 proposes several fixes: • Allow users to have an immediate timeout (no service, no waiting) • Still have to cope with a ServiceUnavailableException When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  19. 19. Blueprint 1.1 to the rescue • Despite aiming to be “simple” Blueprint 1.0 sucked at optionality... • Blueprint 1.1 proposes several fixes: • Allow users to have an immediate timeout (no service, no waiting) • Still have to cope with a ServiceUnavailableException • Allow users to specify a “default” service implementation When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  20. 20. Blueprint 1.1 to the rescue • Despite aiming to be “simple” Blueprint 1.0 sucked at optionality... • Blueprint 1.1 proposes several fixes: • Allow users to have an immediate timeout (no service, no waiting) • Still have to cope with a ServiceUnavailableException • Allow users to specify a “default” service implementation • This can be a nice way to avoid branches in your code When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  21. 21. Blueprint 1.1 to the rescue • Despite aiming to be “simple” Blueprint 1.0 sucked at optionality... • Blueprint 1.1 proposes several fixes: • Allow users to have an immediate timeout (no service, no waiting) • Still have to cope with a ServiceUnavailableException • Allow users to specify a “default” service implementation • This can be a nice way to avoid branches in your code • Allows users to use a “null proxy” as the default implementation When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  22. 22. Blueprint 1.1 to the rescue • Despite aiming to be “simple” Blueprint 1.0 sucked at optionality... • Blueprint 1.1 proposes several fixes: • Allow users to have an immediate timeout (no service, no waiting) • Still have to cope with a ServiceUnavailableException • Allow users to specify a “default” service implementation • This can be a nice way to avoid branches in your code • Allows users to use a “null proxy” as the default implementation • Avoids making you an API provider When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  23. 23. Is Service Optionality really ‘optional’ When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  24. 24. Is Service Optionality really ‘optional’ • The optionality so far has made an implicit assumption When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  25. 25. Is Service Optionality really ‘optional’ • The optionality so far has made an implicit assumption • The API was not optional! When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  26. 26. Is Service Optionality really ‘optional’ • The optionality so far has made an implicit assumption • The API was not optional! • OSGi does a great job of managing dependencies When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  27. 27. Is Service Optionality really ‘optional’ • The optionality so far has made an implicit assumption • The API was not optional! • OSGi does a great job of managing dependencies • Automatic dependency provisioning When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  28. 28. Is Service Optionality really ‘optional’ • The optionality so far has made an implicit assumption • The API was not optional! • OSGi does a great job of managing dependencies • Automatic dependency provisioning • Prevent resolution unless dependencies are satisfied When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  29. 29. Is Service Optionality really ‘optional’ • The optionality so far has made an implicit assumption • The API was not optional! • OSGi does a great job of managing dependencies • Automatic dependency provisioning • Prevent resolution unless dependencies are satisfied • Optional dependencies don’t have the same guarantees! When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  30. 30. Optional Packages When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  31. 31. Handling Package Optionality When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  32. 32. Handling Package Optionality • Having optional package imports makes OSGi more like a normal classpath When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  33. 33. Handling Package Optionality • Having optional package imports makes OSGi more like a normal classpath • You need to be defensive - ClassNotFoundException could happen! When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  34. 34. Handling Package Optionality • Having optional package imports makes OSGi more like a normal classpath • You need to be defensive - ClassNotFoundException could happen! • Unusually for OSGi the factory pattern can be helpful When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  35. 35. Handling Package Optionality • Having optional package imports makes OSGi more like a normal classpath • You need to be defensive - ClassNotFoundException could happen! • Unusually for OSGi the factory pattern can be helpful • Select the implementation with or without the dependency as appropriate When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  36. 36. Handling Package Optionality • Having optional package imports makes OSGi more like a normal classpath • You need to be defensive - ClassNotFoundException could happen! • Unusually for OSGi the factory pattern can be helpful • Select the implementation with or without the dependency as appropriate • Blueprint can use factories to create managed beans When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  37. 37. Handling Package Optionality • Having optional package imports makes OSGi more like a normal classpath • You need to be defensive - ClassNotFoundException could happen! • Unusually for OSGi the factory pattern can be helpful • Select the implementation with or without the dependency as appropriate • Blueprint can use factories to create managed beans • It can be useful to isolate dependent code in a handler class When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  38. 38. Handling Package Optionality (2) When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  39. 39. Handling Package Optionality (2) • Optional packages can be very hard to manage When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  40. 40. Handling Package Optionality (2) • Optional packages can be very hard to manage • Having multiple optional dependencies can explode complexity When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  41. 41. Handling Package Optionality (2) • Optional packages can be very hard to manage • Having multiple optional dependencies can explode complexity • Effectively you’re back to the complexity of a Java Classpath! When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  42. 42. Handling Package Optionality (2) • Optional packages can be very hard to manage • Having multiple optional dependencies can explode complexity • Effectively you’re back to the complexity of a Java Classpath! • Possible approaches to consider: When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  43. 43. Handling Package Optionality (2) • Optional packages can be very hard to manage • Having multiple optional dependencies can explode complexity • Effectively you’re back to the complexity of a Java Classpath! • Possible approaches to consider: • Don’t make the API optional, have two bundles, one with the dependency and the other one without When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  44. 44. Handling Package Optionality (2) • Optional packages can be very hard to manage • Having multiple optional dependencies can explode complexity • Effectively you’re back to the complexity of a Java Classpath! • Possible approaches to consider: • Don’t make the API optional, have two bundles, one with the dependency and the other one without • If all you care about is ease of use then repackage the API When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  45. 45. Handling Package Optionality (2) • Optional packages can be very hard to manage • Having multiple optional dependencies can explode complexity • Effectively you’re back to the complexity of a Java Classpath! • Possible approaches to consider: • Don’t make the API optional, have two bundles, one with the dependency and the other one without • If all you care about is ease of use then repackage the API • Keep a careful internal dependency structure When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  46. 46. Thanks! • For more about OSGi... • Specifications at http://www.osgi.org • Enterprise OSGi in Action • http://www.manning.com/cummins Questions? http://www.paremus.com info@paremus.com When is ‘optional’ really optional? Tuesday, 29 October 13 Copyright © 2005 - 2013 Paremus Ltd. May not be reproduced by any means without express permission. All rights reserved. Oct 2013
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×