Adobe AEM / OSGI: как мне получить доступ к службе OSGI из любого класса?

#osgi #aem #sling

#osgi #aem #sling

Вопрос:

У меня есть служба (расположенная внутри core / services) и реализация службы (расположенная core / services / impl).

У меня есть существующий класс (расположенный внутри core/ impl/ view /components), который расширяет com.adobe.cq.sightly.WCMUsePojo. Используя getSlingScripterHelper, этот класс может получить доступ к службе, о которой я упоминал выше.

Я пытаюсь получить доступ к службе без использования WCMUsePojo. Как я могу это сделать?

Спасибо!

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

1. Мне любопытно, почему вы не хотите расширять wcmusepojo?

Ответ №1:

Вы можете получить службу непосредственно из реестра служб-

     final Bundle bundle = FrameworkUtil.getBundle(this.getClass());
    final BundleContext bundleContext = bundle.getBundleContext();
    ServiceReference<MyService> ref = bundleContext.getServiceReference(MyService.class)
    MyService myService = bundleContext.getService(ref);
    // use the service
    bundleContext.ungetService(ref);
  

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

1. Имейте в виду, что любой подход к извлечению службы из реестра очень чувствителен к проблемам с синхронизацией. В OSGi служба может быть опубликована и не опубликована в любое время. Таким образом, у вас всегда может возникнуть проблема с тем, что getServiceReference или GetService возвращают значение null. Таким образом, вы должны защищать от null, а также должны справляться с отсутствием службы в потоке вашего кода. Как правило, безопаснее сделать ваш код компонентом DS и получить доступ к службе через ссылку.

Ответ №2:

Вы можете использовать @Reference для вызова службы из любого другого класса без использования WCMUsePojo.

 class MyClass
{
    @Reference
    private MyService myService;

    void myMethod()
    {
      myServie.callYourServiceMethod();
    }
}
  

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

1. Это работает только в том случае, если MyClass это сама служба / компонент.

Ответ №3:

Если вы хотите получить доступ к службе из компонента поддержки HTL-скрипта, вы можете использовать модель Sling (вместо WcmUsePojo) и ввести ссылку на свою службу с помощью @Inject аннотации.