2016-06-22 21 views
1

Ich habe eine Komponente Apache Felix, der wie folgt aussieht Definition ist:Was würde dazu führen, dass die @Activate-Methode nicht für Apache Felix aufgerufen wird?

... 
@Component(immediate=true) 

@Service 
public class myClass implements myClassInterface { 
    ... 
    @Activate 
    public void activate(final Map<String, Object> properties) { 
     //Do activation stuff 
    } 
    ... 
} 

Aus der Lektüre der Apache Felix Dokumentation zu den @Component und @Activate Anmerkungen (http://felix.apache.org/documentation/subprojects/apache-felix-maven-scr-plugin/scr-annotations.html#component) Ich verstehe, dass das immediate=true Attribut für den @Component „sofort aktiviert“ . Mein Problem ist, dass meine activate Methode scheint nie aufgerufen werden. Ich habe meinen Debugger von dem Moment an, in dem ich mein Projekt erstelle, bis zu dem Moment, als ich den Service myClass unter Verwendung von OSGi anfordere, aber die activate Methode scheint nie aufgerufen zu werden.

Also, meine Frage hat ein paar Schichten: 1. Sagen Sie mir, dass immediate=true Attribut bewirkt, dass die Komponente "sofort aktiviert werden" gibt mir nicht genug Informationen. Bedeutet dies, dass die Komponente sofort nach dem Erstellen des Projekts aktiviert wird, unmittelbar nachdem eine Instanz myClass erstellt wurde oder unmittelbar nachdem der Dienst myClass vom OSGi-Paket angefordert wurde? 2. Gibt es irgendetwas, was dazu führen könnte, dass meine Methode activate trotz meiner Verwendung von immediate=true nicht aufgerufen wird? Wenn ja, was kann ich tun, um das Problem zu beheben?

Vielen Dank im Voraus für Ihre Hilfe. Bitte lassen Sie mich wissen, wenn ich zusätzliche Informationen bereitstellen muss.

Antwort

3

Sofort = false bedeutet, dass die Komponente erst aktiviert wird, wenn sie von einer anderen Komponente angefordert wird. Immediate = true bedeutet, dass es aktiviert wird, sobald alle obligatorischen Referenzen vorhanden sind.

Wenn also Ihre Komponente nicht aktiviert ist, dann ist vielleicht ein Dienst, den sie benötigt, nicht vorhanden. Sie können den Status der Komponenten überprüfen, indem Sie die scr-Befehle in der gogo-Shell verwenden.

Eine andere Sache ist zu definieren, mit welcher Schnittstelle der Dienst veröffentlicht werden soll. Ich bin nicht sicher über die Felix SCR-Annotationen, aber mit DS-Annotationen, die Sie @Component (service = myClass.class) setzen müssen, wenn die Klasse keine Schnittstelle implementiert.

Btw. Sie sollten zu den Standard-DS-Anmerkungen wechseln. Siehe http://enroute.osgi.org/doc/217-ds.html. Die Felix sind jetzt veraltet.

+0

Danke für die nützlichen Informationen. Ich habe in der Felix-Dokumentation keine Informationen gesehen, die darauf hinwiesen, dass die Anmerkungen veraltet waren. Da eine Komponente erst aktiviert wird, wenn die erforderlichen Dienste vorhanden sind, weiß ich, was ich tun kann, um das Debugging zu starten. Woher weiß ich, welche Referenzen für eine bestimmte Komponente obligatorisch sind? – Pr4isethesun

+0

Sie müssen die DS-Spezifikation oder die Dokumentation, die ich verlinkt habe, einchecken. Standardmäßig ist @Reference obligatorisch. –