Une fois qu'une instance d'un service OSGi est récupéré à partir du contexte de paquet ne il devient invalidée lorsque le service est arrêté ?
Non, la référence elle-même n'est pas invalidée. Tant que quelque chose se trouve dans le contenant, il ne peut pas non plus être GC.
Toutefois, qu'il soit toujours utile ou non, cela dépend uniquement de l'implémentation de service elle-même, pas du conteneur. Mes tests initiaux montrent que l'instance de service peut être utilisée même après l'arrêt du service bundle, ce qui contredit ma compréhension de la nature dynamique de l'OSGi. Les spécifications elles-mêmes indiquent que de telles références ne devraient pas être tenues, mais il appartient à l'exécutant de veiller à la mise en œuvre correcte des spécifications; signifie qu'il n'y a pas de contradiction, il y a seulement le fait que vous pouvez implémenter et déployer des bundles qui ne se comportent pas correctement selon les spécifications.
Je suppose que cela se résume à ce que la récupération d'un service (via ServiceTracker) d'un autre paquet dans le conteneur OSGi ne fait, elle ne crée une nouvelle instance ou elle vous donne un pointeur à l'instance qui est enregistré dans le conteneur?
Le conteneur ne crée pas de nouvelles instances de services, sauf s'il s'agit d'une ServiceFactory impliquée (voir les spécifications). Rechercher un service devrait toujours vous donner un pointeur vers l'instance enregistrée dans le conteneur.
Y a-t-il des dangers dans l'utilisation de l'instance de service après l'arrêt du service?
Cela dépend uniquement de l'implémentation du service; Cependant, en faisant cela dans un paquet, vous créez automatiquement un paquet qui n'est pas conforme aux spécifications.
En pratique, de nombreux services sont implémentés pour libérer des ressources et des références et ne répondront plus correctement.
Merci pour la réponse, malheureusement pas un oui définitif ou non comme je l'espérais! –