# OSGi Declarative Service Cardinality



## splinter (28. Okt 2011)

Hi

Ich habe auf folgende Frage bezüglich Kardinalität von DS noch keine Antwort gefunden:

Ein exportiert ein Interface und hat eine Component welche immer nur eine Implementation dieses Interfaces referenziert, also die Kardinalität steht auf 0..1 oder 1..1

Nun sind aber mehrere andere Components unter diesem Interface registriert. Welche Implementation wird dann referenziert? Wie wird ausgewählt und kann ich darauf irgendwie Einfluss nehmen?

Danke für eure Hilfe!


----------



## Gast2 (29. Okt 2011)

Ich versteh deine Frage nicht du gibst die implementation doch immer an.
Du kannst mehrere Interface angegeben aber nur eine implementation.


----------



## splinter (30. Okt 2011)

Oke, nochmals anderst:

Ich habe ein Interface (nennen es wir mal "Service"), welches von Bundle A exportiert wird.
Bundle B und C haben je eine Component die Service implementiert.

Nun möchte ich eine weitere Component schreiben (in Bundle D), die "Service" referenziert mit der Kardinalität 1..1
Es sind nun zwei Components die "Service" anbieten vorhanden, welche wird meiner Component zugewiesen?


----------



## Gast2 (30. Okt 2011)

Ich glaube das Bundle, welches zu erst gestartet wurde.

Aber sowas kann man doch einfach ausprobieren. Setz einen Listener in Bundle D und schau wie oft er augerufen wird.


----------



## splinter (1. Nov 2011)

SirWayne hat gesagt.:


> Ich glaube das Bundle, welches zu erst gestartet wurde.



Danke für den Hinweis. Dies ist beim Startup-Prozess aus technischen Gründen tatsächlich so. Wenn nämlich eine Component gestartet wurde, ist die andere resolved und wird auch gestartet, je nach Fall auch bevor eine zweite, als Referenz mögliche, Component gestartet ist. Leider kann dies nicht eine abschliessende Antwort sein, da pro Bundle mehrere Components definiert werden können, die denselben Service implementieren.

Schlussendlich scheint mir die Zuteilung der Components in einem solchen Fall zufällig zu sein. :bahnhof:

Wie auch immer, wie löst ihr ein solches Problem? Ihr habt mehrere Components, die einen bestimmten Service anbieten, benötigt aber nur eine. Wie wählt ihr aus? Gibt's dazu bereits Frameworks?


----------



## maki (1. Nov 2011)

Bin nicht so tief in DS drinnen, aber sollte man dazu nicht das name Attribut nutzen, um zwischen verschiedenen Service Providern zu wählen/unterscheiden ?


----------



## splinter (1. Nov 2011)

maki hat gesagt.:


> Bin nicht so tief in DS drinnen, aber sollte man dazu nicht das name Attribut nutzen, um zwischen verschiedenen Service Providern zu wählen/unterscheiden ?



Das ist absolut richtig, wenn du denn weist wie der gewünschte Provider überhaupt heisst. ;-)
Ich habe bereits daran gedacht ein Tool zu schreiben, das alle vorhandenen Components nach Interface auflistet und den User per Config-GUI nach der präferierten fragt. Allerdings stellen sich dabei einige Probleme:
- Konfiguration muss vor Programmstart erfolgen, also nach OSGi-Resolve aber bevor "eigentlichem" Programmstart.
- Referenzierende Components müssen über zusätzliche API die präferierte Component aussuchen.
- Ein zusätzliches Framework ist nötig wenn für unterschiedliche referenzierende Components unterschiedliche Präferenzen angegeben werden sollen.
- usw...

Angesichts des Umfangs eines solchen Tools und der eigentlich höchst simplen Aufgabe (ich vermute mal dass ich nicht der einzige mit diesem Problem bin), die es erledigen soll, muss ich zum Schluss gelangen, dass ich entweder einen Architekturfehler mache/irgend ein OSGi-Konzept nicht kenne oder dass bereits ein solches Framework besteht und ich einfach nicht die richtigen Fragen an Google stelle. ;-)


----------

