Come posso distinguere tra servizi OSGI pubblicati che implementano la stessa interfaccia con le loro proprietà?Cerca servizi OSGI per proprietà
risposta
Supponendo che si desidera recuperare servizi registrati in base a determinati valori per le proprietà, è necessario utilizzare un filtro (che si basa sulla sintassi LDAP).
Ad esempio:
int myport = 5000;
String filter = "&(objectClass=" + MyInterface.class.getName()
+ ")(port=" + myport + ")";
ServiceReference[] serviceReferences = bundleContext.getServiceReferences(null,filter);
in cui si desidera cercare i servizi sia di attuazione MyInterface
e che hanno un valore della proprietà port
pari a myport
.
Here è il javadoc pertinente per ottenere i riferimenti.
Nota 1:
L'esempio sopra e javadoc riferiscono alla versione 4.2. Se non sei limitato a un runtime di J2SE 1.4, ti suggerisco di dare un'occhiata alla Release 4.3 syntax, dove puoi usare i generici.
Nota 2: (per gentile concessione di Ray)
È possibile anche pre-verificare la correttezza del vostro filtro creando invece un oggetto Filter da una stringa filterStr
:
Filter filter = bundleContext.createFilter(filterStr);
che permette anche devi abbinare il filtro con altri criteri. Passi ancora filterStr
per ottenere i riferimenti, poiché non c'è sovraccarico che conti per un argomento Filter
. Si prega di essere consapevoli, tuttavia, che in questo modo si verificherà la correttezza due volte: sia getServiceReferences
e createFilter
lanciare InvalidSyntaxException
sull'analisi del filtro. Sicuramente non è un'inefficienza da show-stop, immagino, ma vale la pena menzionarlo.
La risposta di Luca sopra è corretta, tuttavia si presume che si stia utilizzando l'API di basso livello per l'accesso ai servizi.
Se si utilizzano i servizi dichiarativi (che in genere consigliamo), il filtro può essere aggiunto all'attributo target
del riferimento del servizio. Per esempio (usando le annotazioni BND per DS):
@Reference(target = "(port=8080)")
public void setHttpService(HttpService http) {
// ...
}
Vorrei davvero che ci fosse un approfondito tutorial sull'utilizzo di DS (+ annotazioni). Neil, ne conosci uno (anche se è per l'acquisto)? Assumendo 4.2 (4,3 al massimo). – Ray
@Ray: per quanto riguarda i libri, nessuno tratta le annotazioni bnd poiché non sono sullo standard. Per DS vorrei suggerire il libro "OSGi ed Equinox" (R4.2, ancora senza libro in giro per R4.3 tranne alcuni riferimenti in "OSGi in profondità") –
In Blueprint è possibile specificare l'attributo di filtro sul elemento di riferimento o il riferimento-list. Ad esempio:
<reference id="sampleRef"
interface="org.sample.MyInterface"
filter="(port=5000)"/>
che non funziona, si ottiene Requisito insoddisfatto (s): --------------------------- servizio: (& (servizio = MyInterface) (porta = 5000)) [container- nome] all'avvio del contenitore (nomi di classi e contenitori modificati in modo appropriato). Non ho idea di cosa stia cercando di dire quell'errore. Tristemente stiamo usando la roba senza speranza documentata ... – StripLight
- 1. Come fornitura di servizi OSGi per cliente
- 2. Cerca utente per proprietà profilo
- 3. OSGi: Blueprint sostituisce i servizi dichiarativi?
- 4. Integrazione di servizi Guice e OSGi
- 5. Servizi dichiarativi OSGi e ManagedService per la configurazione del servizio?
- 6. Qual è la differenza tra componenti e servizi OSGi
- 7. Sicurezza basata su ruoli per OSGi
- 8. c'è un modo per visualizzare i servizi registrati in un'applicazione OSGi?
- 9. Come utilizzare la proprietà multi valore (array) in OSGi?
- 10. Avvia programmaticamente OSGi (Equinox)?
- 11. I servizi WCF espongono le proprietà?
- 12. Punto di pareggio per OSGi
- 13. utilizzando osgi per sviluppare un'applicazione
- 14. OSGi e Java EE - JOSGiEE?
- 15. Utilizzo libreria non osgi in un'applicazione osgi
- 16. OSGi + Hibernate
- 17. granularità moduli/bundle OSGi
- 18. Architettura dei servizi OSGi: creazione del servizio su richiesta del consumatore
- 19. Utilizzo di servizi dichiarativi OSGi nel contesto di un test JUnit
- 20. Come ottenere i servizi OSGi da un pacchetto in Sling/CQ
- 21. Cosa c'è di diverso tra inseguitore del servizio OSGi e servizi dichiarativi
- 22. Come impostare una proprietà di sistema per l'adattatore JUL log4j2 in un ambiente OSGi
- 23. Cerca e sostituisci le proprietà formattate all'interno della stringa Java
- 24. Utilizzo di OSGi per implementare l'aggiornamento automatico
- 25. Managing OSGi Dipendenza inferno
- 26. Cerca contatto per numero telefonico
- 27. Qual è il percorso corretto per la creazione di micro servizi in Java? Spring Boot o OSGI
- 28. Struttura pacchetto bundle OSGi
- 29. OSGi e server applicazioni
- 30. OSGi Threading Model
voglio solo aggiungere che sarebbe bene per convalidare la sintassi filtro con filtro Filtro = bundleContext.createFilter (filterStr); in primo luogo, solo per il controllo iniziale della sanità mentale, in particolare la più dinamica creazione del filtro. – Ray
@Ray: una buona osservazione da fare. È sfortunato che OSGi non imponga (o nemmeno permetta) di passare Filter come argomento, comunque. –
@LucaGeretti c'è un modo più intelligente per trovare servizi OSGI dichiarativi? –