2009-12-16 4 views
18

Je suis à la recherche d'une meilleure pratique pour arrêter un conteneur OSGi.Meilleur moyen d'arrêter un conteneur OSGi (en particulier l'équinoxe)

Actuellement, nous utilisons une petite application de lancement qui appelle EclipseStarter.startup() et installe des paquets de base. Après cela, le lanceur se termine. Lorsque l'interface graphique de test (exécutée en tant qu'ensemble) est fermée, elle appelle System.exit (0) pour arrêter le conteneur, mais il doit y avoir une solution plus élégante que celle-ci.

Merci

Répondre

21

Veuillez ne pas utiliser System.exit (0) pour fermer une infrastructure OSGi. Vous devriez le faire en arrêtant le paquet avec l'ID 0, le paquet System. De cette façon, vous donnez à tous les groupes une chance de fermer de manière ordonnée (par exemple pour libérer des ressources, etc.).

La spécification OSGi définit les éléments suivants (Spécification de base, R4.x, 4.2.6 Arrêt d'une infrastructure). L'arrêt peut être initié en arrêtant l'ensemble du système, [...] ou en appelant la méthode stop sur l'objet de structure.

Dans ce chapitre, une description détaillée est donnée ce qui se passe quand un cadre est arrêté.

Le paquet système resp. l'objet-cadre est également défini (chapitre 4.6 Le Bundle System):

Le faisceau de système ressemble à l'objet-cadre lorsqu'un cadre est lancé, mais les mises en œuvre ne sont pas tenus d'utiliser le même objet pour l'objet-cadre et le système paquet. Toutefois, les deux objets doivent avoir l'ID de regroupement 0, le même emplacement et le nom symbolique du regroupement. La spécification OSGi est disponible gratuitement sur le site Web de l'Alliance OSGi (http://www.osgi.org/Specifications/HomePage).

4

J'utilise aussi Equinox dans un contexte intégré d'application et j'appelle stop() sur le faisceau du système et de suivre cela avec EclipseStarter.shutdown(). Vous devrez peut-être arrêter tous vos paquets.

Je n'ai jamais vraiment été préoccupé par l'arrêt du paquet dans mon application puisqu'il n'y a pas d'état conservé.

0

Il n'y a pas encore de façon standard de le faire. OSGI fera cette partie de leur API standard dans la prochaine version, mais je pense qu'il faudra un certain temps avant que tous les conteneurs OSGI implémentent cela. Utilisez le code spécifique au conteneur pour l'instant, mais restez loin de System.exit().

Cordialement,

Leen Toelen

+0

La méthode standard jusqu'à présent, c'est ce que j'ai décrit dans ma réponse. C'est le comportement spécifié dans les spécifications OSGi, également dans la prochaine version 4.2. La prochaine version (4.2.) comprendra le service de niveau de démarrage * optionnel * qui peut être utilisé pour contrôler le niveau de démarrage des ensembles (et le cadre). – akr

7

i arrêtent généralement le cadre comme celui-ci:

bundlecontext.getBundle(0).stop();

Le bundle avec id = 0 est le système à faisceau

Questions connexes