More Related Content Similar to When is 'optional' really optional? - Tim Ward (20) When is 'optional' really optional? - Tim Ward1. 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