Quando um fragment OSGi é anexado ao host?

Eu tenho um pacote OSGi com serviço de persistência (usando o hibernate ) e um fragment, que contém configuração (arquivo xml). No ativador do pacote, estou carregando a configuração usando:

 @Override public void start(BundleContext ctx) { URL url = ctx.getBundle().getResource("hibernate.cfg.xml"); SessionFactory sessionFactory = new AnnotationConfiguration().configure(url).buildSessionFactory(); } 

mas às vezes, o URL é nulo. Quando tentei listar todos os URL disponíveis (usando o método findEntries ), pareceu que os próprios do pacote estão sempre disponíveis, mas os fragments apenas às vezes. Estou usando o Felix 4.0.2, o pacote e o fragment é iniciado no mesmo Felix . nível de auto.start.

Fragmentos são anexados ao host no momento em que o host é resolvido. Normalmente, o fragment será anexado, desde que seja instalado antes de o host ser resolvido.

No entanto, há sempre a possibilidade de o host resolver sem o fragment, porque os hosts não dependem de seus fragments. Portanto, normalmente você deve escrever seu host para que ele possa lidar com o fragment que não está presente – isto é, ele não deve lançar NPEs etc.

Desde o OSGi R4.3, você pode introduzir uma dependência do host em seu fragment usando os headers de Provide-Capability solicitação e Provide-Capability fornecimento. Ao inventar seu próprio namespace para a dependência, você pode fazer com que seu fragment forneça a Provide-Capability . Então, o seu host pode Require-Capability lo com o Require-Capability …. agora a estrutura do OSGi garantirá que o fragment esteja disponível antes de resolver o host.

O fragment é anexado ao host durante o processo de resolução do pacote de fragments. O host é resolvido e pode ser iniciado com sucesso, mesmo que o fragment não esteja lá; mas o fragment é dependente do host – ele pode ser resolvido e depois iniciado somente depois de ser anexado ao host.

Tendo ambos os pacotes com o mesmo nível inicial, parece que você criou condições de corrida para esses dois pacotes. A estrutura começa a resolver e iniciar ambos os pacotes ao mesmo tempo. Às vezes, ele consegue iniciar o pacote do host antes que o processo de resolução do fragment tenha terminado -> então o método start do pacote configurável do host se comporta como se nenhum fragment estivesse disponível.

O que você pode fazer é, por exemplo, fornecer ao fragment um nível de início anterior ao do pacote do host. O fragment deve ser resolvido e iniciado com êxito, mesmo que o pacote do host ainda não tenha sido iniciado. Só precisa que o pacote do host seja resolvido.

Você também pode testar este comportamento em outras estruturas OSGi – por exemplo, no mBedded Server (mBS) do ProSyst – eu sei que ele é totalmente compatível com a especificação OSGI 4.2 onde a resolução de fragment acima é especificada.