OSGi Best and Worst Practices Martin Lippert Context Client apps - - PowerPoint PPT Presentation

osgi best and worst practices
SMART_READER_LITE
LIVE PREVIEW

OSGi Best and Worst Practices Martin Lippert Context Client apps - - PowerPoint PPT Presentation

OSGi Best and Worst Practices Martin Lippert Context Client apps using: Swing, Hibernate, JDO, JDBC, JNI, SOAP, a lot of Apache stuff, JUnit, FIT, Spring DM, Jetty, CICS-Adaptor, Server apps using: JDO, Hibernate, SOAP,


slide-1
SLIDE 1

OSGi Best and Worst Practices

Martin Lippert

slide-2
SLIDE 2

Context

  • Client apps using:

 Swing, Hibernate, JDO, JDBC, JNI, SOAP, a lot of Apache stuff, JUnit, FIT, Spring DM, Jetty, CICS-Adaptor, …

  • Server apps using:

 JDO, Hibernate, SOAP, REST, Tomcat, Spring DM, CICS- Adaptor, HTTP, a lot of custom libs, Memcached

  • Eclipse platforms and frameworks including:

 Equinox, IDE, RCP, p2 and various RT projects

  • Educating and mentoring people in the real world
slide-3
SLIDE 3

Don’t program OSGi

slide-4
SLIDE 4

Program your application

  • Use POJO
  • Keep your business logic clean
  • Programming practices to make gluing easy
  • Dependency injection to allow composition
  • Separation of concerns
  • Benefits

 Delay packaging decisions  Increased deployment flexibility

slide-5
SLIDE 5

Solutions composed of POJOs

  • Bundle POJOs as needed
  • Glue together using

 Use Declarative Services  iPOJO  BluePrint Services  GuicePeaberry  …

  • Use insulating layers to keep OSGi out of your code
slide-6
SLIDE 6

Structure matters

slide-7
SLIDE 7

Dependencies

Managing dependencies within large systems is one of the most critical success factors for healthy object-oriented business applications

slide-8
SLIDE 8

What kind of dependencies?

  • Dependencies between:

 Individual classes and interfaces  Packages  Subsystems/Modules

  • Dependencies of what kind?

 Uses  Inherits  Implements

slide-9
SLIDE 9

Don’t shoot the messenger

OSGi

Module Factory

Around here our policy is to shot the messenger!

slide-10
SLIDE 10

“Low coupling, high cohesion” Not just a nice idea OSGi makes you think about dependencies It does not create them!

slide-11
SLIDE 11

Observations when using OSGi

  • Design flaws and structural problems often have a

limited scope

 Problems remain within single bundles  No wide-spreading flaws

slide-12
SLIDE 12

Take just what you need

slide-13
SLIDE 13

Import-Package vs. Require-Bundle

  • Require-Bundle

 Imports all packages of the bundle, including re-exported bundle packages

  • Import-Package

 Import just the package you need

slide-14
SLIDE 14

What does it mean?

  • Require-Bundle

 Defines a dependency on the producer  Broad scope of visibility

  • Import-Package

 Defines a dependency on what you need  Doesn't matter where it comes from!

slide-15
SLIDE 15

When to use what?

  • Prefer using Import-Package

 Lighter coupling between bundles  Less visibilities  Eases refactoring

  • Require-Bundle only when necessary:

 Higher coupling between bundles  Use only for very specific situations:

  • split packages
slide-16
SLIDE 16

Version management

  • Version number management is essential
  • Depending on a random version is pointless
  • Failing to manage version numbers undermines

consumers

  • Import-Package  package version management
  • Require-Bundle  bundle version management
slide-17
SLIDE 17

Keep Things Private

slide-18
SLIDE 18

API

  • API is a contract with between producer and consumer

 Prerequisites  Function  Consequences  Durability

  • Key to effective modularity
slide-19
SLIDE 19

Bundle API

  • What should you export from a bundle?
  • The easy way:

 Blindly export everything

  • That is a really bad idea:

 No contract was defined  Consumers have no guidance  Broad visibility  High coupling between components

slide-20
SLIDE 20

Producers: Think about your APIs

  • Export only what consumers need

 Less is more  Think about the API of a component  API design is not easy

  • Don’t export anything until there is a good reason for it

 Its cheap to change non-API code  Its expensive to change API code

slide-21
SLIDE 21

Consumers: Think about what you’re doing

  • Stay in bounds
  • If you can’t do something, perhaps

 Use a different component  Use the component differently  Work with the producer to cover your use-case

slide-22
SLIDE 22

Informed Consent

slide-23
SLIDE 23

Composing

slide-24
SLIDE 24

Structuring Bundles

Just having bundles is not enough You still need an architectural view You still need additional structures

slide-25
SLIDE 25

Your Bundles shouldn't end up like this

Go! Get some structure!

slide-26
SLIDE 26

Guidelines

  • Bundle rules in the small

 Separate UI and core  Separate client and server and common  Separate service implementations and interfaces  Isolate backend connectors

  • Bundle rules in the mid-size

 Access to resources via services only  Access to backend systems via services only  Technology-free domain model

slide-27
SLIDE 27

Guidelines

  • Bundle rules in the large

 Separate between domain features  Separate between applications / deliverables  Separate between platform and app-specific bundles

  • Don’t be afraid of having a large number of bundles

 Mylyn  Working Sets  Platforms

slide-28
SLIDE 28

Dynamics

slide-29
SLIDE 29

Dynamics are hard

Its hard to build a really dynamic system, you need to change your mindset Think about dependencies Think about services Think about everything as of being dynamic

slide-30
SLIDE 30

Dynamics are hard

It’s even harder to turn a static system into a dynamic one

slide-31
SLIDE 31

Integration

slide-32
SLIDE 32

Integration is easy

Integrating an OSGi system into an existing environment is easy OSGi runtimes are easy to start and to embed Clear separation between inside and outside world

slide-33
SLIDE 33

Experiences

  • Integrate existing rich client app into proprietary client

container

 Ugly boot-classpath additions like XML parser stuff  Self-implemented extension model using classloaders in a strange way  Used a large number of libs that where not necessarily compatible with the existing rich client app

  • Integration went smoothly

 just launch your OSGi framework and you are (mostly) done

slide-34
SLIDE 34

Integration can be hard

  • Using existing libraries can be hard

 Sometimes they do strange classloader stuff  Start to love ClassNotFoundException, it will be your best friend for some time

  • The Context-Classloader hell

 Some libs are using context-classloader  OSGi has no meaning for context-classloader  Arbitrary problems

slide-35
SLIDE 35

Experiences

  • We got every (!) library we wanted to use to work

within our OSGi environment

 Rich-client on top of Equinox  Server-app on Equinox  Server-app embedded into Tomcat and Jetty using Servlet- Bridge

  • But it can cause some headaches at the beginning
slide-36
SLIDE 36

Conclusions

slide-37
SLIDE 37

Looking back

  • Large OO systems grow over years
  • Its easy and fast to add/change features
  • OSGi is a major reason…
  • But why?
slide-38
SLIDE 38

OSGi leds us to…

  • Thinking about structure all the time

 Avoids mistakes early (before the ugly beast grows)  Less and defined dependencies  No broken windows

  • Good separation of concerns
  • Dependency injection & pluggable architecture

 Easy to add features without changing existing parts

  • Many small frameworks

 Better than few overall ones

slide-39
SLIDE 39

Conclusions

Never without OSGi You will love it You will hate it

slide-40
SLIDE 40

In the end its your best friend

slide-41
SLIDE 41

Thank you for your attention

Martin Lippert: martin.lippert@it-agile.de

Special thanks to Jeff McAffer