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

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();
Hinterlasse einen Kommentar