Я долгое время изучал OSGi, но я все еще чувствую, что недостает важной части головоломки.Получение конкретной реализации от Felix
Это мой случай использования:
Я использую JAX-RS (гризли), чтобы создать REST API. У меня есть интерфейс, который имеет множество различных реализаций. Мое решение должно иметь возможность добавлять новые реализации в любое время.
Основываясь на какой-либо форме ввода, я должен получить один из этих конкретных экземпляров. Например, скажем, я регистрирую две реализации интерфейса с помощью Felix Interface A
и Interface B
. Пользователь должен уметь запросить Implementation B
С помощью командной строки, которую мы получаем от запуска felix.jar
(Apache Felix Gogo) Я смог установить и запустить свои собственные пакеты. Проблема, с которой я сейчас сталкиваюсь, заключается в том, как я должен с одного из моих контроллеров извлекать любую из этих реализаций.
Вот код активатора одной из моих реализаций.
public class MyClassActivator implements BundleActivator {
@Override
public void start(BundleContext context) throws Exception {
System.out.println("Starting ImplementationA");
Hashtable<String, String> props = new Hashtable<>();
props.put("Identifier", "ImplementationA");
context.registerService(MyInterface.class.getName(), new MyClassA(), props);
}
@Override
public void stop(BundleContext context) throws Exception {
System.out.println("Stopping ImplementationA");
}
private class ImplementationA implements MyInterface {
/*my implementation*/
}
}
От одного из моих классов JAX-RS, я хочу, как-то, сделайте это:
MyInterface myclassA = getBundle("ImplementationA");
Строка ImplementationA
это та же строка, я поместил на карте реквизита.
То, что я пытался до сих пор
BundleContext bc = FrameworkUtil.getBundle(MyInterface.class).getBundleContext();
Это, однако, только возвращает нуль, это, кажется, не на самом деле будет «говорить» к моему примеру ФЕЛИКС.
Итак, мои вопросы: как мне получить интерфейс от Феликса? И что я хочу делать с OSGi?