2009-12-16 8 views
18

Ich suche nach einer Best Practice beim Herunterfahren eines OSGi Containers.Die beste Methode zum Herunterfahren eines OSGi Containers (speziell Tagundnachtgleiche)

Momentan verwenden wir eine kleine Launcher-App, die EclipseStarter.startup() aufruft und einige Core-Bundles installiert. Danach wird der Launcher beendet.

Wenn die Test-GUI (die als Bundle ausgeführt wird) geschlossen wird, ruft sie eine System.exit (0) auf, um den Container herunterzufahren, aber es muss eine elegantere Lösung als diese sein.

Dank

Antwort

21

Bitte verwenden Sie System.exit (0) nicht, um ein OSGi-Framework herunterzufahren. Sie sollten dazu das Bündel mit der ID 0, dem System-Bundle, anhalten. Auf diese Weise geben Sie allen Bündeln die Möglichkeit, ordnungsgemäß herunterzufahren (z. B. Ressourcen freizugeben).

Die OSGi-Spezifikation definiert Folgendes (Kernspezifikation, R4.x, 4.2.6 Stoppen eines Frameworks).

Die Abschaltung kann durch Stoppen des Systempakets [...] oder durch Aufruf der stop-Methode für das Framework-Objekt ausgelöst werden.

In diesem Kapitel wird eine detaillierte Beschreibung gegeben, was passiert, wenn ein Framework heruntergefahren wird.

Das Systembündel resp. das Framework-Objekt ist ebenfalls definiert (Kapitel 4.6 Das Systempaket):

Das System-Bundle ähnelt dem Framework-Objekt beim Start eines Frameworks, Implementierungen müssen jedoch nicht das gleiche Objekt für das Framework-Objekt und das System verwenden bündeln. Beide Objekte müssen jedoch die Paket-ID 0, den gleichen Speicherort und den symbolischen Namen des Pakets haben.

Die OSGi-Spezifikation ist auf der Website der OSGi Alliance (http://www.osgi.org/Specifications/HomePage) kostenlos verfügbar.

4

Ich benutze Equinox auch in einem Anwendungskontext eingebettet, und ich rufe stop() auf dem System-Bundle und das mit EclipseStarter.shutdown Follow-up(). Möglicherweise müssen Sie alle Ihre Bundles stoppen.

Ich war nie wirklich besorgt über das Herunterfahren des Bundles in meiner Anwendung, da es keinen beibehaltenen Zustand gibt.

0

Es gibt keine Standardmethode, dies zu tun. OSGI wird diesen Teil ihrer Standard-API in der nächsten Version machen, aber ich nehme an, dass es eine Weile dauern wird, bis alle OSGI-Container dies implementieren. Verwenden Sie zunächst containerspezifischen Code, aber halten Sie sich von System.exit() fern.

Grüße,

Leen Toelen

+0

Der übliche Weg

bundlecontext.getBundle(0).stop();

das Bündel mit id = 0 ist das System-Bundle so weit ist das, was ich in meiner Antwort beschrieben habe. Dies ist das in den OSGi-Spezifikationen angegebene Verhalten, auch in der nächsten Version 4.2. Die nächste Veröffentlichung (4.2.) enthält den * optionalen * Start Level Service, mit dem die Start-Ebene von Bundles (und das Framework) gesteuert werden kann. – akr

7

i in der Regel den Rahmen wie folgt beenden: