Предположим, у меня есть нижеуказанный OSGi-компонент, который должен отправлять событие каждый раз, когда во время выполнения регистрируется новая реализация SomeInterface
.
Для этого я связываю EventAdmin
с eventAdmin
переменная, а затем использовать ее внутри bindSomeInterface
метода.
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.component.annotations.ReferenceCardinality;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventAdmin;
@Component
public class Sender {
private EventAdmin eventAdmin;
@Reference
public void bindEventAdmin(EventAdmin eventAdmin) {
this.eventAdmin = eventAdmin;
}
public void unbindEventAdmin(EventAdmin eventAdmin) {
this.eventAdmin = null;
}
@Reference(cardinality = ReferenceCardinality.MULTIPLE)
public void bindSomeInterface(SomeInterface instance) {
// var prop create here... (non relevant code)
Event event = new Event("topic", prop);
// it is NULL!
eventAdmin.sendEvent(event);
}
public void unbindSomeInterface(SomeInterface instance) {
}
}
Сгенерированный XML-файл:
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="com.package.Sender">
<reference bind="bindSomeInterface" cardinality="0..n" interface="com.package.bindSomeInterface" name="SomeInterface" policy="static" unbind="unbindSomeInterface"/>
<reference bind="bindEventAdmin" interface="org.osgi.service.event.EventAdmin" name="EventAdmin" policy="static" unbind="unbindEventAdmin"/>
<implementation class="com.package.Sender"/>
</scr:component>
ПРОБЛЕМА
bindSomeInterface
сначала вызывается (получая «уведомление» о том, что во время выполнения зарегистрирован новый экземпляр SomeInterface
), а затем вызывается bindEventAdmin
.Это нежелательный эффект.
Ожидаемое поведение
Я бы хотел сначала связать экземпляр EventAdmin
, а затем SomeInterface
.
Как я могу это сделать?
Очень близкий вопрос (НО не тот же): Порядок привязки декларативных услуг OSGi
PS: я пытаюсь избежать ServiceTraker
s и тому подобное.