Domanda

Ciao ragazzi. Stiamo utilizzando servizi OSGi in un'applicazione Eclipse RCP. Per tenere traccia di loro, stiamo utilizzando la classe org.osgi.util.tracker.ServiceTracker. Un codice di esempio dagli sguardi di applicazioni come

mailServiceTracker = new ServiceTracker(context, MailService.class.getName(), null);
mailServiceTracker.open();
MailService service = (MailService) mailServiceTracker.getService();

Ora il mio problema è che il metodo getService() ritorna frequentemente null quando ho creato un nuovo servizio. Il codice funziona molto bene per i servizi che sono già esistenti per lungo tempo nella domanda, ma ogni volta che creo un nuovo servizio, devo fare molte cose fino a quando il servizio è finalmente trovato e monitorato. Provo regolarmente ad esempio

  • 'Clean ...' in Eclipse
  • 'Aggiorna' tutti i progetti in Eclipse
  • Rigenerare il progetto sulla riga di comando

A volte queste cose aiuto, ea volte non lo fanno. Qualcuno ha esperienze con quelle inseguitori e può dirmi come evitare questo comportamento e come ottenere i servizi monitorati immediatamente al momento della creazione?

Grazie

È stato utile?

Soluzione

Il problema è che i servizi che si desidera potrebbe non sono stati ancora creato (specialmente in un attivatore fascio, come alcuni pacchetti possono non aver ancora iniziato). Se si desidera continuare a utilizzare il tracker servizio, sarà necessario fornire un ServiceTrackerCustomizer, e tenere traccia (mi dispiace, no pun intended) dei servizi come vengono e andare.

In alternativa, si può solo passare a dichiarativa servizi che gestire questo per voi.

Altri suggerimenti

Non c'è niente di sbagliato con l'utilizzo ServiceTrackers a parte il fatto che si tratta di un modo abbastanza basso livello di servizi di monitoraggio. Mentre sono d'accordo che i servizi dichiarativi sono un meccanismo bella, semplicemente respingendo ServiceTrackers a causa di "ogni tipo di problema" suona come un cattivo consiglio.

Torna alla domanda.

Non appena viene creato e aperto un tracker di servizio, ti dà accesso a tutti i servizi che corrispondono la condizione di filtro specificata al momento della creazione. Non v'è alcun ritardo lì. L'unica cosa che posso pensare è che in qualche modo i vostri pacchi non vengono risolti correttamente, quindi i servizi che sono registrati da una Un bundle non sono semplicemente visibili a un fascio B utilizzando un ServiceTracker. Per verificare questo, prima di individuare il bundle che le esportazioni il pacchetto contenente l'interfaccia del servizio, e quindi assicurarsi che sia A che B sono in realtà collegati ad esso.

Spiegando l'aggiornamento / meccanismo di aggiornamento in OSGi un po 'di più:

Ogni volta che si aggiorna qualcosa in OSGi, si tratta di un processo in due fasi.

Supponiamo si aggiorna un pacchetto che contiene una nuova versione di un pacchetto esportato. Supponiamo anche c'è qualche consumatore che le importazioni di esso. Finché si aggiorna solo il pacchetto, ma non aggiorna in modo esplicito il cablaggio (di cui collegamenti importazione cui esportazione) il consumatore sarà ancora collegati alla vecchia versione del pacchetto. Non appena si fa un aggiornamento del pacchetto (qualcosa che si può fare in OSGi tramite il servizio PackageAdmin) vostro consumatore verrà risolto ancora e sarà collegato alla nuova versione.

Il motivo di questo è disaccoppiato è che si potrebbe desiderare di fare gli aggiornamenti di diversi pacchetti e non "di aggiornamento" dopo ogni uno, ma invece rinviare tale aggiornamento fino a quando tutti sono aggiornati.

E 'molto probabile che questo è l'effetto che stai vedendo. Inizialmente fate solo un aggiornamento, e solo dopo l'aggiornamento sarà il tracker effettivamente vedere la nuova versione del servizio.

Non essendo irriverente a tutti, non utilizzare inseguitori di servizio. Appaiono per rendere la vita semplice, ma ci sono tutti i tipi di problemi con loro. Mi consiglia che si guarda in utilizzando dichiarativa servizi, invece. Il supporto per DS in Eclipse è stato molto buono da 3.5 in poi.

Si potrebbe voler controllare questo libro e le presentazioni associati per ulteriori informazioni sul motivo per cui utilizzando il servizio Tracker è una cattiva idea.

http://equinoxosgi.org/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top