2012-06-22 23 views

risposta

17

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.

+1

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

+0

@Ray: una buona osservazione da fare. È sfortunato che OSGi non imponga (o nemmeno permetta) di passare Filter come argomento, comunque. –

+0

@LucaGeretti c'è un modo più intelligente per trovare servizi OSGI dichiarativi? –

7

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) { 
    // ... 
} 
+0

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

+0

@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à") –

2

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)"/> 
+0

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

Problemi correlati