Компонент OSGI не активирован после активации пакета

#spring-boot #osgi

#весенняя загрузка #osgi

Вопрос:

новое в OSGI.

Я использую spring-boot в OSGI. В bundle activator приложение spring-boot запускается успешно. У меня есть класс компонента, как показано ниже

 @Service // spring-boot annotation
@Component(immediate = true) // osgi annotation
public class Test {
    @Activate
    public void activate() {
        System.out.println("osgi component activated");
    }

    @Reference
    public void set(ServiceComponentXXX a) {
        System.out.println("reference got");
}
  

Тест класса связывает только службы и не привязывается никакими другими. Класс ServiceComponnetXXX из другого пакета. методы activate и set никогда не выполняются.

После удаления аннотации spring-boot @Service код работает нормально. итак, вопрос в том, может ли класс быть как компонентом spring-boot, так и компонентом OSGI?

Ответ №1:

На самом деле не имеет смысла заставлять класс быть обоими. Жизненные циклы spring boot и декларативных служб полностью разделены. Таким образом, в лучшем случае вы получаете два экземпляра класса — один, заполненный spring boot, а другой — декларативными службами, — но гораздо более вероятно, что он просто не работает.

Я предлагаю решить, хотите ли вы перейти на OSGi. Если да, то просто используйте декларативные службы, а не весеннюю загрузку. В общем, решите для одного фреймворка для инъекций. В OSGi у вас может быть один фреймворк для инъекций в комплекте, но они должны быть совместимы с OSGi. Весенняя загрузка на самом деле не совместима с OSGi.

Комментарии:

1. есть ли какое-либо решение для компонента OSGI использовать компонент spring-boot в том же пакете OSGI или наоборот? предыстория заключается в том, что 1) существует традиционное настольное приложение, реализованное с помощью OSGI, 2) Мне нужно предоставить веб-интерфейс для этого приложения, 3) в настоящее время решение заключается во внедрении spring-boot в пакет OSGI, для получения данных из service-componenet и для ответа на http-запрос через spring-boot, чтобы обнаружить изменение состояния настольного приложения из сервис-компонента и уведомить веб-клиент об изменении состояния через RabbitMQ

2. Нет хорошего способа интегрировать spring boot и OSGi. Я предлагаю полагаться на решения OSGi для http. Существует спецификация доски http и спецификация доски jax-rs. Поэтому, если вы хотите предложить или вызвать службу rest, это можно сделать в чистом пакете OSGi. Rabbit mq также готов к OSGi. Поэтому я предлагаю использовать декларативные сервисы в качестве внедрения зависимостей, а также вышеуказанные спецификации и драйвер rabbitmq для связи.

3. устаревшее приложение работает с java7; rabbitmq для OSGI зависит от java8; http для OSGI требует больше кодирования по сравнению с spring-boot.