J'ai une application dynamique qui utilise OSGi pour charger des fonctionnalités modulaires lors de l'exécution. Les bundles OSGi contiennent la fonctionnalité modulaire et l'application charge les bundles lorsqu'ils sont nécessaires. Cette approche fonctionne bien, mais je voudrais une solution plus granulaire. Les bundles contiennent des composants contrôlés par le biais des services déclaratifs. J'aimerais pouvoir charger un paquet et activer uniquement les composants nécessaires dans le bundle. J'ai fait des recherches dans ce domaine, mais je ne trouve pas de solution satisfaisante. Une approche consistait à créer un composant "gatekeeper" qui est toujours activé dans le bundle et à travers ComponentContext, il laisse l'appel activer et désactiver le composant. C'est une solution viable, mais je ne pouvais pas trouver un moyen pour le «portier» de «connaître» les autres composants du bundle sans coder en dur les noms des composants en tant que propriétés dans le descripteur SCR xml «gatekeepers».OSGi et gestion des composants
Ce que je préfère est un moyen de charger des paquets et de "connaître" tous les composants dans les paquets chargés. Être capable de déterminer dans quel paquet se trouvent les composants et dans quel état ils se trouvent (similaire à la commande 'ls' de la console equinox qui liste tous les composants). Je voudrais activer et désactiver les composants si nécessaire.
Comment est-ce que la console fait ceci et comment pourrais-je faire ceci dans une application?
Mise à jour: @Neil Bartlett: Désolé pour le retard. Je devais passer à autre chose. Maintenant, je suis de retour sur cette question. Vraiment apprécierait toute aide supplémentaire. Mon application est basée sur le rôle. Je dois activer les composants en fonction de la fonctionnalité qu'ils fournissent. L'objectif est que tous les composants basés sur les rôles soient initialement désactivés. Lors d'un changement de rôle, un gestionnaire de rôles interroge chaque composant pour connaître la fonctionnalité fournie et détermine s'il faut le charger. Chaque composant diffusera les fonctionnalités qu'il fournit (via une interface de service commune). ScrService ne me permettra pas d'activer un composant de service initialement désactivé. L'activation initiale des composants et le fait que ScrService les désactive le plus tôt possible au démarrage de l'application ne correspondent pas à mes besoins.
Oui, le portier doit connaître les ID des composants qu'il souhaite activer/désactiver. Gardez à l'esprit que vous pouvez également passer 'null' pour activer/désactiver * tous * les autres composants du bundle. De plus, comme vous le savez probablement, le gatekeeper peut uniquement accéder aux autres composants du même bundle, pas à aucun autre bundle. La suggestion de "quarante-deux" pour utiliser le ScrService est bonne. –
@Toolshed Avez-vous enfin résolu cela? J'ai le même problème avec ScrService. –
@ PabloGarcía Fini avec une implémentation très désordonnée qui nécessitait un analyseur scr xml personnalisé. Cela a fonctionné d'accord, mais était loin d'être idéal et a travaillé pour mes besoins personnalisés. – Toolshed