2010-11-07 15 views
9

Ho cercato su Internet ma non sono riuscito a trovare una risposta soddisfacente. Qual è il modello di threading presente in un contenitore OSGi? Ad esempio, genera semplicemente una nuova discussione per ogni pacchetto registrato, ad esempio? Qualsiasi riferimento riguardante il modello di threading sarebbe ottimo.OSGi Threading Model

risposta

9

Non hai trovato nulla perché non esiste un "modello di threading OSGi". I bundle esistono semplicemente e non "hanno thread" a meno che non li avviino.

+1

Sono ancora confuso. Intendi dire che, a meno che i thread di fork dei bundle non siano solo un'esecuzione a thread singolo? In questo scenario come funziona il multitasking? Ad esempio, un bundle potrebbe eseguire un calcolo mentre un altro bundle sta servendo una richiesta di rete. In che modo lo scenario come questo viene gestito nel framework? Mi dispiace per la mia ignoranza. – chamibuddhika

+12

Sì, i pacchetti sono liberi di creare thread in base alle proprie esigenze. Se un bundle esegue un calcolo di lunga durata o sta servendo una richiesta di rete, tali cose si verificano in genere nei thread creati dal pacchetto. Per favore leggi il capitolo sulla concorrenza del mio (gratuito, ma incompiuto) libro: http://njbartlett.name/osgibook.html –

+0

Wow, Neil - questo è un libro eccellente! Oh, e ho appena visto che stai parlando anche di DS - non vedo l'ora di arrivarci. Spero che continuerai a scriverlo, e vorrei comprare una copia cartacea! – drozzy

4

Il framework OSGi segue un modello sincrono, vale a dire. tutto accade in un ordine rigoroso. I pacchetti non vengono eseguiti nei thread (ma hanno le loro istanze del classloader). Ci sono alcune eccezioni, però. Ad esempio, quando un evento viene generato tramite il metodo postEvent, la consegna dell'evento viene eseguita in modo asincrono, solitamente implementata in molte implementazioni framework come thread.

4

Quando si avvia un pacchetto, il codice nell'attivatore viene eseguito in un thread, in modo simile al thread "principale". Quando il thread principale completa la sua esecuzione, il bundle viene cambiato dallo stato 'Starting' allo stato 'Active'. Quindi è meglio eseguire codice che richiede molto tempo in un altro thread e avviare un altro thread dal thread principale.

Quando il metodo di servizio viene chiamato dal servizio consumatore. In quel momento, il codice scritto nel metodo di servizio viene eseguito nel thread del consumatore del servizio.

Non ho trovato alcuna differenza tra variabili statiche e variabili locali nel metodo di servizio.

0

Oltre ad alcuni casi speciali (eventi/ascoltatori) i thread dell'applicazione sono gestiti o limitati. Puoi usare la filettatura liberamente. È necessario essere consapevoli del fatto che alcune operazioni nel ciclo di vita del bundle devono essere (quindi) thread-safe e bisogna essere molto attenti a strappare i thread in modo pulito. Devi anche stare attento a non bloccare le operazioni OSGi inutilmente.