Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why should I prefer OSGi Services over exported packages?

I am trying to get my head around OSGi Services. The main question I keep asking myself is: What's the benefit of using services instead of working with bundles and their exported packages?

As far as I know it seems the concept of Late Binding has something to do with it. Bundle dependencies are wired together at bundle start, so they are pretty fixed I guess. But with services it seems to be almost the same. A bundle starts and registers services or binds to services. Of course services can come and go whenever they want and you have to keep track of these chances. But the core idea doesn't seem that different to me.

Another aspect to this seems to be that services are more flexible. There could be many implementations for one specific Interface. On the other hand there can be a lot of different implementations for a specific exported package too.

In another text I read that the disadvantage of using exported packages is that they make the application more fragile than services. The author wrote that if you remove one bundle from the dependency graph other dependencies would no longer be met, thus possibly causing a domino effect on the whole graph. But couldn't the same happen if a service would go offline? To me it looks like service dependencies are no better than bundle dependencies.

So far I could not find a blog post, book or presentation that could clearly describe why services are better than just exposing functionality by exporting and importing packages.

To sum my questions up:

What are the key benefits of using OSGi Services that make them superior to exporting and importing packages?


Addition

I have tried to gather further information about this issue and come up with some kind of comparison between plain export/import of packages and services. Maybe this will help us to find a satisfying answer.

  1. Start/Stop/Update

    Both, bundles (hence packages) and services, can be started and stopped. In addition to that they can be kind of updated. Services are also tied to the bundle life cycle itself. But in this case I just mean if you can start and stop services or bundles (so that the exported packages "disappear").

  2. Tracking of changes

    ServiceTracker and BundleTracker make it possible to track and react to changes in the availability of bundles and services.

  3. Specific dependencies to other bundles or services.

    If you want to use an exported package you have to import it.

    Import-Package: net.jens.helloworld
    

    Would net.jens.helloworld provide a service I would also need to import the package in order to get the interface.

    So in both cases their would be some sort of "tight coupling" to a more or less specific package.

  4. Ability to have more than one implementation

    Specific packages can be exported by more than one bundle. There could be a package net.jens.twitterclient which is exported by bundle A and bundle B. The same applies to services. The interface net.jens.twitterclient.TwitterService could be published by bundle A and B.

To sum this up here a short comparison (Exported packages/services):

  1. YES/YES
  2. YES/YES
  3. YES/YES
  4. YES/YES

So there is no difference.

Additionally it seems that services add more complexity and introduce another layer of dependencies (see image below).

alt text http://img688.imageshack.us/img688/4421/bundleservicecomparison.png

So if there is no real difference between exported packages and services what is the benefit of using services?

My explanation:

The use of services seems more complex. But services themselves seem to be more lightweight. It should be a difference (in terms of performance and resources) if you start/stop a whole bundle or if you just start and stop a specific service.

From a architectural standpoint I also guess that bundles could be viewed as foundation of the application. A foundation shouldn't change often in terms of starting and stopping bundles. The functionality is provided by services of this packages in some kind of dynamic layer above the "bundle layer". This "service layer" could be subject to frequent changes. For example the service for querying a database is unregistered if the database is going offline.


What's your opinion? Am I starting to get the whole point of services or am I still thinking the wrong way? Are there things I am missing that would make services far more attractive over exported packages?

like image 749
Jens Avatar asked May 05 '10 20:05

Jens


People also ask

What is the difference between import package and export package?

Using Export he dispatches the packages to the customer and integrates them back into the software library using Import. A customer sends a package to the Support for checking. Packages can be exchanged between several DSM environments.

What are OSGi services?

The OSGi Service Platform provides a mechanism for developing applications by using a component model and deploying those applications into an OSGi framework. The OSGi architecture is separated into a number of layers that provide benefits to creating and managing Java™ applications.

What is OSGi import package?

OSGi allows for dependencies to be determined via Import-Package , which just wires up a single package (exported from any bundle), and Require-Bundle , which wires up to a specific named bundle's exports.

What are OSGi components?

OSGi is a set of specifications. Its core specification defines a component and service model for Java. A software component in OSGi is called bundle or plug-in, both terms are interchangeable. Services are Java implementations which OSGi allows to start and access.


2 Answers

Its quite simple: Bundles are just providing classes you can use. Using Imports/Exports you can shield visibility and avoid (for example) versioning conflicts. Services are instances of classes that satisfy a certain contract (interfaces).

So, when using Services you don't have to care about the origin of a implementation nor of implementation details. They may even change while you are using a certain service.

When you just want to rely on the Bundle Layer of OSGi, you easily introduce crosscutting dependencies to concrete implementations which you usually never want. (read below about DI)

This is not an OSGi thing only - just good practice.

In non OSGi worlds you may use Dependency Injection (DI) frameworks like Guice, Spring or similar. OSGi has the Service Layer built into the framework and lets higher level frameworks (Spring, Guice) use this layer. - so in the end you usually dont use the OSGi Service API directly but DI adapters from user friendly frameworks (Spring-->Spring DM,Guice-->Peaberry etc).

HTH, Toni

like image 146
Toni Menzel Avatar answered Oct 15 '22 01:10

Toni Menzel


I'd recommend purchasing this book. It does an excellent job explaining services and walking through the construction of a non-trivial application that makes use of OSGi Services.

http://equinoxosgi.org/

My company routinely builds 100+ bundle applications using services. The primary benefits we gain from using services are:

1) Loose coupling of producer/consumer implementation

2) Hot swappable service providers

3) Cleaner application architecture

like image 24
James Branigan Avatar answered Oct 15 '22 01:10

James Branigan