ekkes corner - ekkes ecke
ekkes corner - ekkes ecke
Properties in Declarative Services und ServiceTracker
Donnerstag, 4. Dezember 2008
Ich habs ja schon in meinem letzten blog Dependencies und Services in OSGI Enterprise Anwendungen vermutet, dass da eine kleine Serie draus wird ;-)
ServiceTracker vs Declarative Services
Diesen Punkt habe ich im letzten Beitrag nur kurz angesprochen - hier folgen ein paar weitere Tips beim Umgang mit Properties.
Der ServiceTracker erhält aufgrund des Filters
final String filterPool = "("
+Constants.OBJECTCLASS
+ "="
+ JDBCPoolComponent.class.getName()
+")";
Services vom Typ JDBCPoolComponent - uns interessiert das Attribut JndiName:
private void processDataSources(JDBCPoolComponent service) {
if (service.getJndiName().equals("foo_entity_data_source_hsql")) {
// do something
}
}
Jetzt dieUmsetzung mit Declarative Services (equinox.ds):
In der Referenz der Service Komponente möchten wir feststellen, wenn exakt ein bestimmter JDBCPoolComponent Service verfügbar ist, da wir dann wissen, dass die DataSource bereitsteht.
Die erste Idee, die Referenz zu deklarieren, könnte sein:
Aber die Referenz wird nicht aufgelöst. Wie finden wir die Ursache heraus ? Dazu prüfen wir zunächst, ob der Filter korrekt ist und das Interface.
Tip: In der Equinox OSGI Konsole den Filter austesten !
Wir starten die OSGI Anwendung und geben diesen Befehl in der OSGI Konsole ein:
services (&(objectclass=org.ow2.easybeans.component.jdbcpool.JDBCPoolComponent)(jndiName=foo_entity_data_source_hsql))
Es wird kein Service aufgelistet: No registered Services.
Als nächstes suchen wir nur nach allen Services des Interfaces JDBCPoolComponent:
services (objectclass=org.ow2.easybeans.component.jdbcpool.JDBCPoolComponent)
Jetzt werden mehrere Services aufgelistet - darunter unser gesuchter:
{org.ow2.easybeans.component.jdbcpool.JDBCPoolComponent}={classname=org.ow2.easybeans.component.jdbcpo......, xmlconfig=<?xml v..........iver" jndiName="foo_entity_data_source_hsql" password="ea......., service.id=80}
Registered by bundle: .../easybeans-component-jdbcpool_1.1.0-M3-SNAPSHOT.jar/
Im aufgelisteten Text entdecken wir auch jndiName="foo_entity_data_source_hsql"
Sehen wir genauer hin, stellen wir fest, dass dem Property xmlconfig mehrere Informationen zugewiesen sind. Das ist die Lösung:
services (&(objectclass=org.ow2.easybeans.component.jdbcpool.JDBCPoolComponent)(xmlconfig=*foo_entity_data_source_hsql*))
Der gesuchte Service wird gefunden und wir können in der Service Komponente die Referenz wie folgt eintragen:
Warum hat der ServiceTracker getJndiName() gefunden, der target Filter aber nicht ?
getJndiName() ist eine Methode des Services JDBCPoolComponent, aber nicht als Property in der Service Registry bekannt ! Target Filter können nicht auf Methoden der Implementierung zugreifen, sondern nur auf Service Properties.
Hinweis:
Wen die Thematik von OSGI Enterprise Anwendungen interessiert, sei auf meine Blogserien hingewiesen.
Ausserdem habe ich einige Submissions zur EclipseCon 2009 eingereicht -
Wer meine Erfahrungen live erleben möchte: Kommentare sind willkommen ;-)