2016-08-07 11 views
0

Вопрос прост, но я не могу найти ответ - могу ли я заявить, что все декларативные услуги в пакете A становятся доступными после пуска A start? Например,OSGI: появляются декларативные услуги после начала пакета

bundle=context.installBundle("file:bundleA-1.0.0.jar"); 
bundle.start(); 
//In this point are declarative services of bundle A 100% available? 

P.S. Я использую apache felix, но я думаю, что он должен быть определен в Specs, но не в реализации.

EDIT:
Я предполагаю, что DS среда работает, конфигурация присутствует и все обязательные ссылки присутствуют.

+0

Те много предположений, которые вы действительно не положение. –

ответ

2

Ответ на ваш вопрос очень прост: НЕТ. Нет никаких гарантий относительно доступности в 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); 

DS Компонент:

@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); 
    } 
}  
+0

Предположим, у меня есть только одна декларативная услуга - служба A. И мне нужно использовать эту услугу в обычном коде, а не в других службах osgi. Итак, я правильно понимаю, что единственный способ - использовать сервис-трекер в такой ситуации? –

+0

ServiceTracker может работать, но есть гораздо более легкое решение.Этот вопрос является одним из ** контроля ** (который я рассматриваю как один из наиболее интересных наименее обсуждаемых аспектов написания кода). То, что я, вероятно, сделаю, это зарегистрировать службу BundleActivator на стороне, отличной от OSGi, а затем создать непосредственный компонент DS на стороне OSGi с соответствующими зависимостями. Этот компонент обращается к службе сторонних разработчиков для активации/деактивации. Таким образом, у вас есть контроль над стороной DS, а сторона non-OSGi следует за ней. –

+0

Я читал вам несколько раз .. но .. не могли бы вы привести пример в коде, что вы имеете в виду? –

0

Вы не можете предположить, что все компоненты DS доступны в качестве сервисов после запуска пучка. Во-первых, необходимо также запустить среду выполнения DS. Затем компоненты DS по умолчанию лениво активируются. Это означает, что они активны только тогда, когда какой-либо другой пакет требует такой услуги, и последние, но не менее важные компоненты активируются только после того, как все их обязательные ссылки присутствуют. Ну ... и прежде, чем я его забуду, вы также можете определить, что компонент активируется только в том случае, если для него присутствует конфиг.

+0

Пожалуйста, см. Мое редактирование. –

+0

В этом случае только ленивая загрузка остается причиной. Вы используете direct = true? –

+0

Я думаю, что существует разница между доступным сервисом и сервисом с созданным экземпляром. Когда я говорю «Доступно», я имею в виду, что если эта услуга необходима, то инфраструктура OSGI будет создавать свои экземпляры. –

 Смежные вопросы

  • Нет связанных вопросов^_^