OSGi fonctionnalité de désinstallation fonctionne, mais les bottes sont encore installé
EDIT: mise à jour de cette question avec les dernières informations...
Je vais avoir des problèmes de fonctionnement back-to-back "caractéristiques:désinstaller" les commandes pour les fonctions dépendantes. OSGi répond avec "modification de l'État en cours...", mais par accepter d'autres demandes, nous nous heurtons à des problèmes.
Étrangement, cette résultats dans la réussite de la fonction désinstalle, mais sans succès bundle désinstalle. Nous répondons à cela en essayant de commande de désinstallation demandes de manière appropriée et en ajoutant un retard entre les étapes, mais je suis l'espoir d'une solution plus robuste.
Comme suggéré, j'ai aussi essayé d'ajouter "osgi:actualiser" en entre les étapes...même comportement. Est-il un autre moyen de détecter que "l'Actualisation des Paquets" est toujours en cours d'exécution pour retarder les demandes ultérieures, etc?
Voici les détails...
karaf@root> caractéristiques:désinstaller PolicyUtil
karaf@root> caractéristiques:désinstallation de Voisinage1
karaf@root> caractéristiques:désinstaller Policy2
Modification de l'état en cours pour les bundle "file:/policy2.jar" en fil d'Actualisation "Packages".
karaf@root> caractéristiques:désinstaller Policy3
Modification de l'état en cours pour les bundle "file:/policy3.jar" en fil d'Actualisation "Packages".
karaf@root> caractéristiques:désinstaller Politique4
karaf@root> caractéristiques:désinstaller Enabler1
Modification de l'état en cours pour les bundle "file:/enabler1.jar" en fil d'Actualisation "Packages".
karaf@root> caractéristiques:désinstaller Enabler2
Modification de l'état en cours pour les bundle "file:/enabler2.jar" en fil d'Actualisation "Packages".
par la suite...nous nous retrouvons avec des fonctionnalités désinstallé (correct), mais certains bundles encore installé (incorrect)
osgi:liste
[ 277] [Installé ] [ ] [ ] [ 60] Policy2
[ 278] [Installé ] [ ] [ ] [ 60] Policy3
[ 280] [Installé ] [ ] [ ] [ 60] Enabler1
[ 281] [Installé ] [ ] [ ] [ 60] Enabler2
caractéristiques:liste
[désinstallé] [1.0 ] PolicyUtil repo-0
[désinstallé] [1.0 ] Stratégie1 repo-0
[désinstallé] [1.0 ] Policy2 repo-0
[désinstallé] [1.0 ] Policy3 repo-0
[désinstallé] [1.0 ] Enabler1 repo-0
[désinstallé] [1.0 ] Enabler2 repo-0
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas sûr de ce type d'exception que vous obtiendrez, mais vous devez être conscient d'une chose: lorsque vous désinstallez un faisceau à l'aide d'une commande shell comme
osgi:uninstall
, vous avez fait appelBundle.uninstall()
. Comme vous pouvez le lire dans la Javadoc là, ce n'est pas l'histoire entière.Le cadre favorise les opérations qui ont un impact minimal sur le reste du cadre, de sorte qu'il peut désinstaller un paquet sans la suppression de tous les paquets liés. Si vous voulez vraiment supprimer tous d'entre eux, vous devez utiliser un
osgi:actualiser
de commande. Pour plus d'informations sur cette question, voir le Felix FAQ.Le meilleur conseil que je puisse donner est de ne pas émettre de multiples
uninstall
demandes que peuvent traverser les uns des autres. Si vous souhaitez supprimer un ensemble de bundles, je voudrais d'incendie le non-passageuninstall()
demandes, suivis par un seulrefreshPackages()
. Aussi, je ne voudrais pas mélanger bundle de gestion à l'aide de la "régulier" de la console et de Karaf dans un seul système.Vous pouvez également envisager l'utilisation d'un gestionnaire externe pour l'installation et le retrait de lots. Si vous voulez la gestion à distance, vous pourrait aller pour Apache ACE (divulgation: je suis un Apache ACE à valider).
Sol ... vous pouvez très simplement le désinstaller votre application avec cette commande:
karaf 2.2.x:
osgi:désinstaller --force yourapp-fonction/0.0.1.INSTANTANÉ
Bien, j'ai fouiné sur ce point et je pense que je comprends la question et les options...merci pour les réponses.
Lorsque "caractéristiques:désinstaller [nom]" est exécuté, il appelle bundle.uninstall(), puis refreshPackages() pour chaque module dans les caractéristiques. Puis, après tous les bundles sont désinstallés, il appelle refreshPackages() pour tous les forfaits. Le problème est que refreshPackages() est asynchrone (par le OSGi spec) et des feuilles de faisceaux dans un état de résolution. Les demandes suivantes pour désinstaller la résolution de fonctionnalités/bundles ne parviennent pas à terminer comme prévu.
Si il y a suffisamment de retard dans l'entre désinstalle ou si, plus tard, la désinstallation est exécuté (après la refreshPackages() a terminé)...tout fonctionne comme prévu.
Options...
Dans mon expérience, cela se produit lorsqu'une ressource d'un bundle est encore référencée ou utilisé par un autre bundle. Dans ce cas, le cadre n'est pas en mesure de retirer le bundle et l'ensemble du fichier jar est toujours traitées par la machine virtuelle.
Jetez un oeil et assurez-vous que toutes les références sont supprimés. Une erreur commune est également toujours thread en cours d'exécution dans l'un des objets instanciés dans le bundle. Ce compte également comme une ressource encore en usage ad qui ne peut pas être supprimé.
Dans mon cas, j'ai désinstallé la fonctionnalité et remarqué la pendaison bundle nombres et l'arrêt de karaf (3.x). Puis j'ai supprimé les sous-dossiers du dossier [karaf-installer]/data/cache/[suspendus-bundle-nombre].
Maintenant, j'ai redémarrer karaf et le bundle guerres apparaissent pas dans le bundle:liste.