Hot-Plugging mit Eclipse RCP und OSGi

OSGi Services

Das OSGi-Framework führt in Eclipse ein serviceorientiertes Programmiermodell ein, mit dessen Hilfe Plug-ins Dienste anbieten und nutzen können. Dabei werden bereitgestellte Dienste in einer zentralen Dienstregistratur (engl. Service Registry) angemeldet, in der sie wieder aufgefunden werden können (Abb. 2).

Abbildung 2: OSGi-Dienstregistratur

In einer dynamischen OSGi-Umgebung können Dienste jederzeit kommen und gehen, weil z. B. das zugehörige Plug-in gestoppt oder gar deinstalliert wurde. Dabei können Probleme entstehen, wenn andere Plug-ins auf den gestoppten Dienst angewiesen sind. OSGi bietet verschiedene Möglichkeiten, um OSGi-Dienste zu beschaffen. Listings 1 und 2 zeigen die Beschaffung eines Dienstes über ein ServiceReference-Objekt sowie über den ServiceTracker.

Listing 1: Beschaffung eines Dienstes über die ServiceReference

ServiceReference kundenServiceReference = bundleContext
      .getServiceReference(IKundenService.class.getName());
  IKundenService kundenService = (IKundenService) bundleContext
        .getService(kundenServiceReference);
Listing 2: Beschaffung eines Dienstes über den ServiceTracker

  ServiceTracker tracker = new ServiceTracker(context,             IKundenService.class.getName(), null);
  tracker.open();
  IKundenService kundenService = (IKundenService) tracker.getService();

Obwohl die aufgezeigten Möglichkeiten die einfachsten sind, bieten sie gleichzeitig auch die meisten Probleme. Da die Startreihenfolge der Bundles in einer OSGi-Umgebung nicht festgelegt ist, kann es durchaus vorkommen, dass der gewünschte Dienst zum Zeitpunkt der Beschaffung noch nicht in der Dienstregistratur angemeldet wurde. Sowohl das ServiceReference-Objekt als auch der ServiceTracker würden in diesem Fall NULL zurückliefern. Ein weiteres Problem entsteht, wenn Dienste zur Laufzeit an- und abgemeldet werden. ServiceReferences und der ServiceTracker (so wie im Beispiel dargestellt) bieten keine Möglichkeiten, mit dieser Dynamik angemessen umzugehen. Um die Dynamik bei OSGi-Diensten zu berücksichtigen, stellt OSGi einen ServiceTrackerCustomizer bereit, der die An- und Abmeldung von Diensten beobachten und bei Bedarf aktiv werden kann (Listing 3).

Listing 3: Dynamisches Beobachten von Dienstanmeldungen und Abmeldungen

  ServiceTracker tracker = new ServiceTracker(context,
    IKundenService.class.getName(), new ServiceTrackerCustomizer() {
    
    @Override
    public Object addingService(ServiceReference reference) {
      IKundenService kundenService = (IKundenService)             context  .getService(reference);
      _kundenVerwalter.bindKundenService(kundenService);
      return kundenService;
    }

    @Override
    public void removedService(ServiceReference reference,
              Object service) {
      IKundenService kundenService = (IKundenService) service;
      _kundenVerwalter.unbindKundenService(kundenService);
    }

    @Override
    public void modifiedService(ServiceReference reference,
              Object service) {
      // do something
    }
  });
  tracker.open();
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.