Инициализация компонентов прототипа OSGi - PullRequest
0 голосов
/ 12 декабря 2018

В декларативных службах OSGi я могу создавать экземпляры прототипов, объявляя ComponentServiceObjects следующим образом:

@Reference(unbind = "-",
           scope=ReferenceScope.PROTOTYPE_REQUIRED)
private ComponentServiceObjects<MyService> serviceProvider;

, а затем создаю экземпляр службы с помощью

service = serviceProvider.getService();

, затем я могу завершитьКонфигурирование экземпляра путем установки некоторых других атрибутов (значения конфигурации или не-OSGi соавторы) с помощью установщиков.Проблема заключается в том, что активация выполняется до завершения инициализации.

Есть ли способ добавить эти атрибуты до активации службы?

Я использую DS в контексте LiferayПортал 7

РЕДАКТИРОВАТЬ

В качестве пояснения у меня есть пример: допустим, у меня есть компонент DirectoryListener.И я хочу инициализировать несколько экземпляров этого компонента, каждый со своим каталогом.Я хотел бы сделать некоторую инициализацию во время активации на основе этого каталога.

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Потребитель службы ничего не знает о компоненте реализации ... или вообще о том, реализован ли сервис компонентом, в отличие от чего-то более низкого уровня.Следовательно, он не может определять конфигурацию компонента.

Похоже, что ваш сценарий использования требует, чтобы каталог составлял API службы, и поэтому ваш интерфейс службы должен быть DirectoryListenerFactory.Компонент может быть зарегистрирован как простой одноэлементный сервис, и каталог будет передаваться с помощью метода, например createListener(File dir).

. В этом случае вам нужно быть немного осторожнее с жизненным циклом.Если клиент вызывает createListener, он должен быть осторожен, чтобы освободить этого слушателя, когда он больше не нужен.Например, DirectoryListener может расширяться java.lang.AutoCloseable.

Любые служебные зависимости могут быть введены через @Reference в класс компонента, который реализует фабрику.Я ожидаю, что они будут переданы экземплярам DirectoryListener через конструктор.

0 голосов
/ 14 декабря 2018

Нил Бартлетт:

Нет, это невозможно, клиент компонента не может определить конфигурацию этого компонента.Звучит так, как будто вы хотите зарегистрировать DirectoryListenerFactory.

...