2012-06-14 14 views
13

Ho un pacchetto OSGi con servizio di persistenza (utilizzando hibernate) e un frammento, che contiene la configurazione (file xml). In attivatore di fascio, sto caricando la configurazione utilizzando:Quando un frammento OSGi è collegato all'host?

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

ma a volte, il URL è nullo. Quando ho tentato di elencare tutti gli URL s disponibili (utilizzando il metodo findEntries), è apparso che gli stessi del bundle sono sempre disponibili, ma solo quelli del frammento. Sto usando Felix 4.0.2, il pacchetto e il frammento viene avviato allo stesso Felix. livello auto.start.

risposta

22

I frammenti si collegano all'host al momento della risoluzione dell'host . Normalmente il frammento verrà allegato fino a quando viene installato prima che l'host risolva.

Tuttavia c'è sempre la possibilità per l'host di risolvere senza il frammento, perché gli host non dipendono dai loro frammenti. Quindi normalmente dovresti scrivere il tuo host in modo che possa far fronte al frammento non presente - cioè non gettare NPE ecc.

Poiché OSGi R4.3 puoi introdurre una dipendenza dall'host sul suo frammento usando il Require-Capability e intestazioni Provide-Capability. Inventando il tuo spazio dei nomi per la dipendenza puoi rendere il tuo frammento fornirlo con Provide-Capability. Quindi il tuo host può richiederlo con Require-Capability .... ora il framework OSGi assicurerà che il frammento debba essere disponibile prima che risolva l'host.

+0

Grazie, richiedono/forniscono capacità funziona perfettamente! – Kojotak

+0

Questo è utile. In realtà non ho mai visto fallire l'usecase (usiamo Equinox), ma non mi ero reso conto che non sarebbe riuscito a risolvere il frammento 'in tempo'. Buono a sapersi. – Robin

+3

Vorrei che StackOverflow mi permettesse di iscrivermi agli utenti solo per leggere tutti i post di Neil. :-) Imparo qualcosa di nuovo quasi ogni volta che risponde! –

0

Il frammento è collegato all'host durante il processo di risoluzione del pacchetto di frammenti. L'host è stato risolto e può essere avviato correttamente anche se il frammento non è presente; ma il frammento dipende dall'host - può essere risolto e successivamente avviato solo dopo che è stato collegato all'host.

Avendo entrambi i bundle con lo stesso livello iniziale, sembra che tu abbia creato condizioni di gara per questi due pacchetti. Il framework inizia a risolvere e avviare entrambi i bundle contemporaneamente. A volte riesce a avviare il pacchetto host prima che il processo di risoluzione del frammento sia stato completato -> quindi il metodo di avvio del pacchetto host si comporta come se nessun frammento fosse disponibile.

Quello che puoi fare è ad es. per dare al frammento un livello iniziale precedente rispetto a quello del pacchetto host. Il frammento dovrebbe risolversi e iniziare correttamente anche se il pacchetto host non è ancora stato avviato. Richiede solo il bundle host da risolvere.

È anche possibile testare questo comportamento su altri framework OSGi - ad es. su ProSyst's mBedded Server (mBS) - So che è pienamente compatibile con la specifica OSGI 4.2 in cui è specificata la risoluzione dei frammenti sopra.

+0

Grazie per i chiarimenti! Sfortunatamente, non funziona. Ho impostato il livello felix.auto.start per il frammento in modo che sia inferiore rispetto al bundle stesso. Ho ricontrollato questo in gogo console - il bundle ha un livello più alto del frammento. Mi sembra che il livello iniziale non garantisca che il bundle/frammento con livello inferiore finisca la sua risoluzione prima di passare a un livello di partenza più alto. – Kojotak

+4

Non è corretto. Innanzitutto, il frammento si attacca al momento in cui * host * viene risolto. In secondo luogo, il framework non si risolve e inizia allo stesso tempo. In effetti, l'avvio non ha alcun impatto sulla risoluzione e non è possibile avviare comunque frammenti. –

Problemi correlati