Ответ на ваш вопрос очень прост: НЕТ. Нет никаких гарантий доступности в OSGi, когда-либо основанных ни на времени, ни на порядке. Единственные гарантии указываются в сервисных событиях.
Делать допущения о времени/порядке в вашем коде — одна из самых больших причин сложности, потому что они всегда нарушаются самым непонятным образом.
DS упрощает написание кода, который правильно реагирует на зависимости службы по мере их появления и исчезновения. Убедиться, что вы получаете эти гарантии, связанные со службами, невероятно сложно, и вы уничтожите всю эту ценность, если начнете делать предположения, что что-то должно быть доступно после вызова метода.
В вашем примере просто полагайтесь на услугу, которая вам нужна. Если эта служба доступна, вы уверены, что вся инициализация выполнена.
Если вы придерживаетесь сервисных зависимостей, жизнь в OSGi довольно проста и очень надежна.
ОБНОВЛЕНО с примером после вопросов
Одна сторона, не поддерживающая OSGi:
systemBundleContext = ... create framework
systemBundleContext.registerService(
BundleActivator.class,
new BundleActivator() {
public void start(BundleContext c) {
// start non-OSGi code
}
public void stop(BundleContext c) {
// stop non-OSGi code
}
},
null );
Компонент ДС:
@Component
public class Initiator {
@Reference
BundleActivator ba;
@Referenc
MyService myService;
@Activate void activate(BundleContext context) throws Exception {
ba.start(context);
}
@Deactivate void deactivate(BundleContext context) throws Exception {
ba.stop(context);
}
}
person
Peter Kriens
schedule
08.08.2016