OSGI Services

WolfBauer

Erfahrenes Mitglied
Guten Morgen,
ich hoffe ich bin hier richtig für meine kleine OSGI-Frage. Ich entwickle mit Eclipse 3.5 und nutze deklarative Services.

Ich habe nun ein BundleA, welches ServiceA zur Verfügung stellt. Dazu habe ich ein weiteres BundleB, welches ServiceA nutzt (1..1, dynamisch).

Wenn ich dies starte funktioniert alles einwandfrei. Bei "ls" werden beide Komponenten aufgeführt. Auch per "ss" sind beide Komponenten sichtbar und bei "services" steht bei BundleA (ServiceA), dass dieses von BundleB genutzt wird. Es scheint also alles zu funktionieren.

Nun kommen wir zu meinem Problem. Wenn ich nun BundleB auch ein ServiceB anbieten soll, werden alle Bundles ebenfalls korrekt gestartet. Das Problem ergibt sich bei "services". Bei BundleA steht nicht mehr, dass BundleB dieses benutzt. D. h. der Service wurde nicht richtig registriert. Auch beim Debuggen, wird die bind-Methode nicht aufgerufen.

Woran kann das liegen? Wenn ich der ServiceB wieder entfernen, registriert sich ServiceA normal. Bei einem anderen Beispiel, welches ich implementiert habe funktioert es ohne Probleme.

Hoffe jemand hat eine Idee. Kann es mit fehlenden activate/deactivate Methoden zu tun haben? Diese verwende ich allerdings auch in der funktionieren Implementierung nicht.

Vielen Dank schon mal,
Viele Grüße
 
Hi,
ich habe gerade noch ein wenig mit dem funktionierenden Beispiel getestet. Diese bietet zwei Services an.

Einmal den CommandProvider und zweitens ein eigenes Interface. Biete ich beide oder nur den CommandProvider an werden die Services richtig eingebunden. Biete ich nur mein Interface an, dann wird der Service nicht genutzt.

Code:
public class SampleRunnable implements Runnable {
	public void run() {
		System.out.println("Hello from SampleRunnable");
	}
}


public class SampleCommandProvider1 extends AbstractCommandProvider implements TestInterface, CommandProvider {
	
	private List<Runnable> runnables =
		Collections.synchronizedList(new ArrayList<Runnable>());
	
	public void addRunnable(Runnable r) {
		runnables.add(r);
	}
	
	public void removeRunnable(Runnable r) {
		runnables.remove(r);
	}

	@Override
	public int rechne() {
		return 0;
	}

	@Override
	public String getHelp() {
		// TODO Auto-generated method stub
		return null;
	}
}

Vielleicht liegt es auch nur an meiner noch zu geringen Erfahrung (ist mein erster Kontakt mit OSGI). Kann es sein, dass die Services wirklich erst eingebunden werden, wenn sie auch wirklich genutzt werden?

D. h. BundleB nutzt BudleA es wird eingebunden, wenn BundleB ein richtiges Programm ist, welches keine Services mehr anbietet? Also die Abhängigkeiten, werden erst gelöst, wenn ein Service auch genutzt wird.

Hoffe das ist jetzt verständlich gewesen ;).

Grüße
 
Ich habe den Fehler endlich gefunden. Genau genommen waren es mehrere. Die alle daher kommen, dass dies mein erstes OSGI-Projekt ist :).

Fehler:
Die Implementierungsklasse von BundleB hat im Konstruktor irgendwo eine Exception geworfen, welche verschluckt wurde.

Zudem war in einer Oberklasse darüber definiert, dass es keinen Standard-Konstruktor gibt. Nur einen mit einem Übergabe-Wert, was natürlich totaler Blödsinn ist. Wie sollte OSGI diesen bitte initialisieren.

Und zu guter letzt, hatte der Konstruktor noch ein throws, was auch zu Problemen führte.


Trotzdem viele Danke für die Mühe.

Grüße
 

Neue Beiträge

Zurück