Я пытаюсь получить методы привязки/отвязки, вызываемые компонентом DS. Я сократил его до простейшего примера, который не работает.
Если я удалю @Reference в методе привязки, тест будет успешным. Очевидно, операторы журнала не вызываются. В противном случае происходит сбой AssertNotNull.
Любые предложения о том, что я делаю неправильно? Как правильно добавить методы привязки/отвязки к компоненту?
Обновлен код, чтобы показать правильный подход.
Интерфейс
public interface Foo {
public abstract String bar();
}
Сорт
@Component(immediate = true, enabled = true, service = Foo.class, scope = ServiceScope.SINGLETON)
public class FooImpl implements Foo {
private final static Logger logger = LoggerFactory.getLogger(FooImpl.class);
@Override
public String bar() {
return "bar";
}
@Activate
public synchronized void bind() {
logger.debug(String.format("bind called for %s", this.getClass().getName()));
}
@Deactivate
public synchronized void unbind(Foo service) {
logger.debug(String.format("unbind called for %s", this.getClass().getName()));
}
}
Определение сгенерированного компонента
<?xml version = "1.0" encoding = "UTF-8"?>
<scr:component xmlns:scr = "http://www.osgi.org/xmlns/scr/v1.3.0" activate = "bindFoo" deactivate = "unbindFoo" enabled = "true" immediate = "true" name = "com.vogelware.experiment.FooImpl">
<service scope = "singleton">
<provide interface = "com.vogelware.experiment.Foo"/>
</service>
<implementation class = "com.vogelware.experiment.FooImpl"/>
</scr:component>
Тестовый класс
class FooTest {
@Test
void test() throws InterruptedException {
ServiceTracker<Foo, Foo> testTracker = new ServiceTracker<Foo, Foo>(Activator.getContext(), Foo.class, null);
testTracker.open();
testTracker.waitForService(500);
Foo user = testTracker.getService();
testTracker.close();
assertNotNull(user); <= fails here
}
}
Ваш компонент пытается использовать себя как зависимость. Таким образом, у вас есть неразрешимая циклическая ссылка. Ваш компонент не может быть удовлетворен (и, следовательно, зарегистрирован как служба Foo), пока не будет удовлетворена его зависимость от службы Foo (@Reference).
Ответ на мой вопрос заключается в том, что в спецификации 1.3 используйте @Activate и @Deactivate. Я изменил исходный вопрос, чтобы показать решение в коде.
Посетите http://blog.vogella.com/2016/06/21/getting-started-with-osgi-declarative-services/ для получения более подробной информации.
Хорошо, это имеет смысл. Как правильно указать методы привязки/отвязки для компонента?