2012-10-25 5 views
-1

Je suis nouveau en utilisant OSGi, j'ai un doute sur le suivi des paquets. J'utilise BundleTracker parce que je veux des paquets spécifiques, et je veux savoir quel paquet j'utilise par leurs identifiants. Certains bundles (3) implémentent la même interface. Je veux suivre uniquement les bundles qui implémentent cette interface. Comment puis-je faire ceci?Suivi des paquets spécifiques dans OSGi

+0

Je voudrais vraiment savoir pourquoi vous voulez faire cela. Dans OSGi en fonction des paquets plutôt que des paquets est une odeur de code, de sorte que vous devriez essayer de l'éviter. Pouvez-vous expliquer pourquoi vous pensez en avoir besoin? –

+0

Im nouveau dans OSGi, désolé si j'ai dit quelque chose qui ne va pas, je veux juste choisir un service spécifique parmi de nombreux faisceaux qui implémente la même interface. –

Répondre

2

Si vous souhaitez sélectionner un service spécifique, vous pouvez utiliser les propriétés du service pour cela. Ceci est complètement agnostique des faisceaux. Cela signifie que vous enregistrez vos implémentations de service avec des propriétés spécifiques (c'est ce à quoi correspond l'argument Dictionary dans BundleContext.registerService).

Vous pouvez ensuite utiliser BundleContext.getServiceReferences et spécifier une expression de filtre (la syntaxe est décrite here) qui sélectionne uniquement le service avec la propriété correcte. Vous pouvez configurer ceci pour que vous obteniez toujours un tableau ou une collection avec au plus un élément.

Tout cela devient beaucoup plus facile si vous utilisez declarative services, car alors vous pouvez simplement spécifier la propriété et le filtre dans le descripteur de service du composant fournissant et consommant respectivement. Vous pouvez également configurer l'une ou les deux extrémités via le configuration admin (les propriétés de la configuration d'un composant de service sont propagées en tant que propriétés des services exposés ou des références consommées). Je vous suggère de vérifier les services déclaratifs avant de commencer un travail sérieux dans OSGi. Notez que vous devez faire attention à ne pas implémenter un câblage codé de cette façon, car cela détruirait la modularité.

+0

Puis-je filtrer les implémentations avec ServiceTracker, puis, à partir de ces paquets suivis, je choisis le bon? –

+1

Oui, 'ServiceTracker' fournit un [constructeur qui accepte un' Filter'] (http://www.osgi.org/javadoc/r4v42/org/osgi/util/tracker/ServiceTracker.html#ServiceTracker%28org.osgi. framework.BundleContext,% 20org.osgi.framework.Filter,% 20org.osgi.util.tracker.ServiceTrackerCustomizer% 29). –

Questions connexes