Подтвердить что ты не робот

Когда фрагмент OSGi привязан к хосту?

У меня есть пакет OSGi с сервисом persistence (с использованием hibernate) и фрагмент, который содержит конфигурацию (файл xml). В активаторе пучка я загружаю конфигурацию, используя:

@Override
public void start(BundleContext ctx) {
   URL url = ctx.getBundle().getResource("hibernate.cfg.xml");
   SessionFactory sessionFactory = new AnnotationConfiguration().configure(url).buildSessionFactory();
}

но иногда значение URL равно null. Когда я попытался перечислить все доступные URL (используя метод findEntries), оказалось, что собственные собственные пакеты доступны всегда, а фрагменты - только иногда. Я использую Felix 4.0.2, пучок и фрагмент запускаются с тем же Felix. auto.start.

4b9b3361

Ответ 1

Фрагменты присоединяются к хосту в момент разрешения хоста. Обычно фрагмент будет прикреплен до тех пор, пока он будет установлен до того, как хозяин разрешит.

Однако всегда существует возможность разрешения хоста без фрагмента, поскольку хосты не зависят от их фрагментов. Поэтому обычно вы должны написать свой хост, чтобы он мог справиться с отсутствием фрагмента, т.е. Он не должен бросать NPE и т.д.

Так как OSGi R4.3 вы можете ввести зависимость от хоста на свой фрагмент, используя заголовки Require-Capability и Provide-Capability. Создав собственное пространство имен для зависимости, вы можете сделать свой фрагмент с помощью Provide-Capability. Тогда ваш хост может потребовать его с помощью Require-Capability.... теперь инфраструктура OSGi гарантирует, что фрагмент должен быть доступен до того, как он разрешит хост.

Ответ 2

Фрагмент присоединяется к хосту во время процесса разрешения фрагмента. Хост разрешен и может начать успешно, даже если фрагмент отсутствует; но фрагмент зависит от хоста - он может быть разрешен и впоследствии запущен только после того, как он привязан к хосту.

Имея оба пучка с одинаковым начальным уровнем, кажется, что вы создали условия гонки для этих двух пучков. Структура начинает разрешать и запускать оба пакета одновременно. Иногда ему удается запустить пакет хостов до того, как процесс обработки фрагмента был закончен → тогда метод начала пакета хостов ведет себя так, как будто никакой фрагмент недоступен.

Что вы можете сделать, например? чтобы дать фрагменту более ранний начальный уровень, чем ранжирование узла. Фрагмент должен разрешаться и запускаться успешно, даже если пакет хоста еще не запущен. Это нужно только для решения узла хоста.

Вы также можете проверить это поведение на других платформах OSGi - например, на ProSyst mBedded Server (mBS) - Я знаю, что он полностью соответствует спецификации OSGI 4.2, где указано указанное выше определение фрагмента.