2010-10-07 5 views
5

J'ai plusieurs ensembles OSGi, chacun pouvant être mis à jour à partir d'un référentiel d'ensembles OSGi. Lorsque je démarre mon framework OSGi (Apache Felix), je veux que le premier paquet démarre et vérifie les mises à jour pour tous les paquets installés. Si des mises à jour sont disponibles, elles doivent toutes être mises à jour (y compris elle-même) puis continuer à démarrer (ou éventuellement arrêter, et le système d'exploitation redémarrera l'application). Comment cela se fait-il de manière conforme à l'OSGi?Mise à jour de l'ensemble OSGi au démarrage

Comment le premier ensemble devrait-il se mettre à jour? Peut-il se mettre à jour pendant le démarrage?

Répondre

4

Il y a quelques choses que vous devez faire:

  1. Assurez-vous que vous avez un paquet (le « agent de gestion », comme il est souvent appelé dans la spécification) qui commence d'abord sur le cadre (re) commence en lui donnant un niveau de départ inférieur à tous vos autres paquets. Veillez également à indiquer au système de démarrer avec un niveau de démarrage égal à celui de l'agent de gestion. De cette façon, ce bundle sera capable de mettre à jour tous les autres bundles dans le framework avant qu'ils ne commencent réellement. Ce n'est qu'après la mise à jour de l'agent de gestion qu'il rafraîchira tous les paquets et passera au niveau de démarrage suivant, démarrant effectivement tous les autres paquets. Pour mettre à jour l'agent de gestion, la meilleure solution consiste à installer temporairement un deuxième ensemble qui effectue réellement la mise à jour. La création de threads au sein de l'agent de gestion n'est pas la meilleure solution, car ces threads ne doivent pas continuer à s'exécuter lorsque le bundle est arrêté et ne pas s'y conformer peut générer des problèmes difficiles à résoudre. Ce deuxième paquet sera effectivement mis à jour et peut-être même annuler si la mise à jour échoue.

Un exemple d'agent de gestion pouvant être mis à jour lui-même peut être trouvé dans le cadre d'Apache ACE. Il dispose d'un agent qui, à partir du code, installera un second paquet pour se mettre à jour depuis un emplacement distant. Quelques pointeurs vers des parties pertinentes de ce projet:

+0

Pour (2), que diriez-vous d'un agent de gestion en deux étapes? mgmtagent.1 - met à jour puis démarre mgmtagent.2, mgmtagent.2 met à jour mgmtagent.1, puis d'autres bundles, puis les lance.J'ai du mal à visualiser comment fonctionne l'installation temporaire du deuxième paquet. D'où est-ce que ça vient? –

+1

J'ai étendu la réponse avec un exemple de cela, Dan. –

2

Vous pouvez consulter le diagramme d'état dans OSGi Core Spec (cela devrait être Fig.28). Là, vous pouvez voir qu'un paquet dans l'état STARTING ne peut passer à l'état ACTIVE (à l'exception d'une exception). Un regroupement peut uniquement être mis à jour lorsqu'il est dans l'état INSTALLED ou RESOLVED. Pour cela, il doit être arrêté dans le cas où il est en état ACTIF.

Le problème ici est que vous ne pouvez pas arrêter un faisceau lorsqu'il est dans l'état STARTING. Et tant que la méthode Activators start() est exécutée, le bundle est toujours dans l'état STARTING, pas ACTIVE.

Ce que vous pouvez faire est de démarrer un thread dans l'ensemble qui vérifie son état pour ACTIVE, puis appelle la méthode update(). Mais n'oubliez pas de terminer le thread, sinon le garbage collector ne peut pas libérer les ressources du fichier jar du bundle actuel.

Questions connexes