When is 'optional' really optional? - Tim Ward

  • 303 views
Uploaded on

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

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.

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
303
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
9
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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