2011-07-16 5 views
5

J'essaie d'apprendre comment fonctionne osgi. J'ai écrit mon premier paquet hello-world qui donne une sortie de console lorsque la méthode de démarrage de la classe activateur de bundle est exécutée. Maintenant, j'ai lu à propos du mécanisme de départ paresseux et j'ai mis ce drapeau dans mon manifeste. Ensuite, j'ai démarré la console Equinox, installé mon bundle et l'ai démarré. mais maintenant, je m'attendais à ce que mon paquet soit marqué comme «démarrage». mais à la place, il appelle déjà sa méthode de démarrage et est marqué comme actif. ai-je compris quelque chose de mal avec le mécanisme de démarrage paresseux ???osgi bundle lifecycle question

Répondre

8

L'indicateur de démarrage différé est utilisé lorsque vous avez autres offres groupées qui dépendent de votre offre groupée et des classes de votre offre groupée.

Supposons que vous avez deux faisceaux A et B, où

  • exporte la classe C
  • B dépend A
  • B contient une classe D qui fait référence C

Qu'est-ce que se passe-t-il lorsque le bundle B est activé?

Sans l'indicateur de chargement paresseux, le groupe A est chargé et activé en premier.

Avec le drapeau paresseux charge, l'un paquet est pas chargé ou activé jusqu'à ce que la classe D doit se référer à la classe C.

Cela peut faire une très grande différence dans le profil d'activation, comme la charge et l'activation des paquets sont reportées pour arriver aussi tard que possible avec le drapeau de chargement paresseux de sorte que la réponse initiale du faisceau est très rapide ...

Au contraire, ce drapeau en fait aussi beaucoup plus Difficulté de raisonner sur le temps d'exécution des méthodes en B car cela peut être intercepté avec chargement et activation de paquets à tout moment ....

+0

Merci beaucoup à vous deux !!! Cela n'a pas été très bien expliqué dans mon livre mais maintenant je le comprends :-) – July

3

Vous avez dit que vous avez déjà démarré votre bundle après l'installation - si vous démarrez votre bundle manuellement, il est activé quelle que soit la politique d'activation paresseuse.

Selon the OSGi specification ce qui suit est vrai pour l'activation:

Une politique d'activation paresseuse indique que le faisceau, une fois commencé, doit pas activée jusqu'à ce qu'une classe est chargée de celui-ci; soit pendant le chargement normal des classes soit via la méthode LoadClass de l'ensemble. Le chargement de la ressource ne déclenche pas l'activation. Cette modification de la politique d'activation par défaut est reflétée dans l'état de l'ensemble et de ses événements . Lorsqu'un paquet est démarré à l'aide d'une politique d'activation paresseux, les étapes suivantes doivent être prises:

  • Un contexte Bundle est créé pour le faisceau.
  • L'état de l'ensemble est déplacé à l'état STARTING.
  • L'événement LAZY_ACTIVATION est déclenché.
  • Le système attend qu'un chargement de classe de l'ensemble se produise.
  • L'événement STARTING normal est déclenché.
  • Le lot est activé.
  • L'état de l'ensemble est déplacé vers ACTIVE.
  • L'événement STARTED est déclenché.

Si l'activation échoue parce que la méthode start Activator Bundle a jeté une exception, le paquet doit être arrêté sans appeler la méthode d'arrêt Activator Bundle . Ces étapes sont illustrées dans un organigramme dans la Figure 4.29. Cet organigramme montre également la différence dans la politique d'activation de l'activation désirée normale et l'activation paresseuse .

Mise à jour: comme je ne peux pas dire quelle version de la spécification que j'ai ouvert au moment où je l'ai écrit la réponse (cependant, je crois, il était soit 4.2 ou 4.3), j'ai vérifié le courant, v5 La spécification .0, et la section 4.4.6.2 contient l'emplacement réel et sémantiquement équivalent.

+1

Vous devez présenter la source de la spécification. Les spécifications peuvent changer avec le temps et les futurs lecteurs (comme moi) ne savent pas d'où et de quelle version vous avez cette citation. –

+1

Merci pour le commentaire; J'ai ajouté des références à la spécification. –

Questions connexes