2012-04-02 1 views
2

Je suis suivi bundles OSGi comme ceci:OSGi BundleTracker: ordre des ensembles chenillés

BundleTracker<Foo> bundleTracker = new BundleTracker<>(context, Bundle.ACTIVE, 
    new BundleTrackerCustomizer<Foo>(){ 

       @Override 
       public Foo addingBundle(Bundle bundle, BundleEvent event) { 
        ... 
       } 

       @Override 
       public void modifiedBundle(Bundle bundle, BundleEvent event, Foo foo) { 
        ... 
       } 

       @Override 
       public void removedBundle(Bundle bundle, BundleEvent event, Foo foo) { 
        ... 
       } 
      }); 

Maintenant, si un paquet B a une dépendance A et B est commencé, alors que je comprends premier faisceau A sera activé Est-ce correct?

Le problème est que je reçois parfois des notifications sur certains bundles avant que je sois averti de leurs bundles dépendants. Alors, comment puis-je être averti dans l'ordre des dépendances (si B dépend de A, alors d'abord notifié à propos de A puis à propos de B)?

Répondre

3

Les dépendances de code (paquet d'importation ou groupe requis) entre les bundles n'affectent pas (en général) l'ordre de début des bundles. Il y a une certaine interaction entre les paquets en utilisant l'activation paresseuse.

Donc, une fois A et B sont résolus, à partir B n'a aucune incidence sur le démarrage A.

La chose importante à noter ici est que les dépendances de la couche de module ne modifient pas l'ordre de démarrage des faisceaux.

+0

Mais si B utilise des classes de A, ne pas dire que A doit être activé avant B? – Puce

+0

@Puce Non, ça ne veut pas dire ça du tout. La réponse de Bj est très claire. –

+0

Serait-il le cas où le paquet A serait toujours résolu avant le paquet B? Si c'est le cas, et que vous avez absolument besoin d'obtenir les notifications dans l'ordre des dépendances, vous pouvez écouter les événements Bundle.RESOLVED, enregistrer l'ordre et en tenir compte lorsque vous recevez les événements Bundle.ACTIVATED. –

2

Les dépendances de code n'ont aucune influence sur l'activation car tous les groupes sont résolus de manière atomique. Donc, quand un paquet est activé, vous êtes sûr qu'il ne dépend que des paquets résolus. OSGi a une couche de module (avec des dépendances de paquet) et une couche de service. La couche de module est statique et la couche de service vous permet d'exprimer des dépendances dynamiques (avec DS).

Si vous êtes aux prises avec ordre de départ vous risquez le fait pas droit ...

+0

Eh bien, oui, j'ai lu maintenant que les meilleures pratiques dictent qu'on ne devrait pas compter sur l'ordre d'activation. Le problème est que j'implémente un framework d'extension basé sur le pattern d'extension, JAXB et les services (certains dynamiques): Bundle A spécifie une interface de point d'extension où les points d'extension doivent retourner leur classe JAXB racine. Les ensembles qui définissent des points d'extension spécifient leurs classes JAXB et enregistrent leur implémentation de point d'extension à l'aide de DS. Bundle A écoute ces points d'extension à l'aide de DS. Il suit également les ensembles et vérifie s'ils ont un fichier XML d'extension. – Puce

+0

Si un paquet a un fichier XML d'extension, il est démasqué en utilisant les classes racine JAXB spécifiées par les points d'extension enregistrés. Si un paquet Y spécifie une extension XML pour un point d'extension défini par le paquet X, alors Y déclare également une dépendance sur X (car il utilise des annotations, un processeur d'annotations et des classes JAXB fournies par Y pour créer le fichier XML d'extension). – Puce

+0

Maintenant, mon hypothèse est que X (avec un fichier XML d'extension) a une dépendance sur Y (spécifiant le point d'extension et les classes JAXB nécessaires pour unmarshall le fichier XML d'extension de X), Y sera activé avant X. Mais le BundleTracker parfois notfies sur les paquets dans un ordre différent. – Puce

Questions connexes