2010-11-07 8 views
9

J'ai cherché sur Internet, mais je n'ai pas trouvé de réponse satisfaisante. Quel est le modèle de threading présent dans un conteneur OSGi? Crée-t-il simplement un nouveau fil de discussion pour chaque lot enregistré, par exemple? Toute référence concernant le modèle de filetage serait géniale.OSGi Threading Model

Répondre

9

Vous n'avez pas trouvé quoi que ce soit parce qu'il n'y a pas une telle chose comme un « modèle de thread OSGi ». Les paquets existent simplement et n'ont pas de "threads" à moins qu'ils ne les démarrent.

+1

Je suis toujours confus. Vous voulez dire que, à moins que les fils de la fourche de bundles, il n'y ait qu'une seule exécution filetée? Dans ce scénario, comment fonctionne le multitâche? Par exemple, un paquet peut faire un calcul tandis qu'un autre paquet sert une requête réseau. Comment un scénario comme celui-ci est-il géré dans le cadre? Désolé pour mon ignorance. – chamibuddhika

+12

Oui, les bundles sont libres de créer des threads lorsqu'ils en ont besoin. Si un regroupement exécute un calcul de longue durée ou si une requête réseau est diffusée, ces événements se produisent généralement dans les threads créés par l'ensemble. S'il vous plaît lire le chapitre concurrency de mon livre (gratuit, mais inachevé): http://njbartlett.name/osgibook.html –

+0

Wow, Neil - c'est un excellent livre! Oh, et je viens de voir que vous parlez de DS aussi - j'ai hâte d'y arriver. J'espère que vous continuerez à l'écrire, et j'achèterais une copie papier! – drozzy

4

Le framework OSGi suit un modèle synchrone, ie. tout se passe dans un ordre strict. Les ensembles ne sont pas exécutés dans les threads (mais ils ont leurs propres instances de classloader). Il y a cependant quelques exceptions. Par exemple, lorsqu'un événement est déclenché via la méthode postEvent, la remise de l'événement est effectuée de manière asynchrone, généralement implémentée dans de nombreuses implémentations de structure en tant que thread.

4

Lorsque vous démarrez un paquet, le code dans l'activateur est exécuté dans un thread, similaire au fil « principal ». Lorsque le thread principal termine son exécution, le bundle passe de l'état 'Starting' à l'état 'Active'. Il est donc préférable d'exécuter du code chronophage dans un autre thread et de démarrer un autre thread à partir du thread principal.

Lorsque la méthode de service est appelée du consommateur de service. À ce moment-là, le code écrit dans la méthode de service est exécuté dans le thread du consommateur de service.

Je ne trouve pas de différence entre les variables statiques et variables locales dans la méthode de service.

0

En dehors de quelques cas particuliers (Manifestations/auditeurs) les fils d'application sont gérés neighter ni restreints. Vous pouvez utiliser le filetage librement. Vous devez être conscient que certaines opérations dans le bundle lifecylce doivent être (par conséquent) thread safe et vous devez être très prudent pour démonter les threads proprement. Vous devez également faire attention à ne pas bloquer les opérations OSGi inutilement longtemps.