2009-12-16 15 views
18

Sto cercando una procedura ottimale per arrestare un contenitore OSGi.Il modo migliore per arrestare un contenitore OSGi (in particolare equinozio)

Attualmente stiamo usando una piccola applicazione di avvio che chiama EclipseStarter.startup() e installa alcuni pacchetti di base. Dopo che il programma di avvio termina.

Quando la GUI di test (in esecuzione come un bundle) è chiusa, chiama System.exit (0) per arrestare il contenitore, ma deve esserci una soluzione più elegante di questa.

Grazie

risposta

21

Per favore, non usare System.exit (0) per chiudere un framework OSGi. Dovresti farlo fermando il bundle con l'ID 0, il pacchetto System. In questo modo, dai a tutti i bundle la possibilità di chiudere in modo ordinato (ad es. Risorse gratuite, ecc.).

La specifica OSGi definisce quanto segue (Specifiche principali, R4.x, 4.2.6 Arresto di un framework).

L'arresto può essere avviato arrestando il pacchetto di sistema, [...] o chiamando il metodo di arresto sull'oggetto framework.

In questo capitolo viene fornita una descrizione dettagliata di ciò che accade quando un framework viene spento.

Il bundle di sistema risp. l'oggetto struttura viene anche definita (capitolo 4.6 Il sistema dei bundle):

Il fascio sistema assomiglia all'oggetto quadro quando un quadro viene lanciato, ma le implementazioni non è richiesto di utilizzare lo stesso oggetto per l'oggetto quadro e il sistema fascio. Tuttavia, entrambi gli oggetti devono avere l'ID bundle 0, la stessa posizione e il nome simbolico del bundle.

Le specifiche OSGi sono disponibili gratuitamente sul sito Web di OSGi Alliance (http://www.osgi.org/Specifications/HomePage).

4

Io uso anche Equinox in un contesto applicativo embedded e mi chiamano stop() sul sistema dei bundle e seguono quello in su con EclipseStarter.shutdown(). Potrebbe essere necessario interrompere tutti i pacchetti.

Non sono mai stato veramente preoccupato per l'arresto del bundle nella mia applicazione poiché non esiste uno stato conservato.

0

Non esiste ancora un modo standard per farlo. OSGI renderà questa parte della loro API standard nella prossima versione, ma suppongo che ci vorrà un po 'prima che tutti i contenitori OSGI lo implementino. Utilizza il codice specifico del contenitore per ora, ma stai lontano da System.exit().

saluti,

Leen Toelen

+0

Il metodo standard finora è quello che ho descritto nella mia risposta. Questo è il comportamento specificato nelle specifiche OSGi, anche nella prossima versione 4.2. La prossima versione (4.2.) includerà il servizio di livello iniziale * opzionale * che può essere utilizzato per controllare il livello iniziale dei pacchetti (e il framework). – akr

7

solito terminare il quadro come questo:

bundlecontext.getBundle(0).stop();

Il bundle con id = 0 è il sistema fascio

Problemi correlati