Osgi getService () - PullRequest
       29

Osgi getService ()

1 голос
/ 24 ноября 2010

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

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

Ответы [ 4 ]

2 голосов
/ 24 ноября 2010

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

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

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

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

1 голос
/ 25 ноября 2010

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

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

0 голосов
/ 01 мая 2019

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

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

0 голосов
/ 11 июля 2013

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

С уважением, Roland

...