Osgi getService()

В нашем проекте (Osgi, Spring-Dm, Apache-Felix) у нас есть некоторые проблемы с производством, когда BundleContext.getService() возвращает значение null. Это происходит очень редко, и не в начале, так что это не проблема неправильной конфигурации.

Альтернативой может быть использование ServiceTracker для поиска службы, но поскольку ошибка встречается довольно редко, я не уверен, что ее изменение решит ситуацию.

3 ответа

Решение

Спецификация OSGi говорит, что метод возвращает

  • Сервисный объект для сервиса, связанный со ссылкой
  • или ноль, если
    • сервис не зарегистрирован
    • объект службы, возвращенный ServiceFactory, не реализует классы, под которыми он был зарегистрирован
    • ServiceFactory бросил исключение

Моим первым предположением будет то, что сервис не зарегистрирован.

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

Уберто, совсем не странно, что сервис еще не зарегистрирован. OSGi динамична. Службы приходят и уходят. Если вы попытаетесь получить доступ к услуге до того, как она будет зарегистрирована, вы получите нулевое значение.

Когда вы выполняете простую функцию getService(), вы предполагаете, что сервис уже существует. Если вам нужен сервис, вы должны вместо этого сделать что-то, что связано с ожиданием события регистрации. Это можно сделать с помощью ServiceTracker, но это довольно низкий уровень. Как уже отмечали другие, использование чего-то вроде Spring-DM или декларативных сервисов делает это довольно простым и надежным.

Я могу подтвердить, что условия гонки могут возникнуть, если вы используете ServiceTracker! Иногда ServiceTracker не может поймать Сервис, даже если сервис зарегистрирован. Чтобы решить проблему, я использую waitForService() вместо getService().

С уважением, Роланд

Если ServiceReference не является нулевым и получает нулевой указатель во время getService(serviceReference), то класс реализации службы не инициализирован должным образом.

Убедитесь, что конструктор класса реализации сервиса общедоступен, и нет ошибок при создании объекта.

Другие вопросы по тегам