Несколько PID для одной целевой службы с аннотациями ds

Мне интересно, можно ли использовать то, что объяснено в параграфе 104.7.5 (Использование нескольких местоположений) спецификаций предприятия osgi, используя декларативные аннотации служб. Цитирую спецификации:

Также возможно, что пакеты заинтересованы в нескольких идентификаторах PID для одной целевой службы, поэтому они могут зарегистрировать несколько идентификаторов PID для одной службы. [...]

Пакет, заинтересованный в конфигурации хоста, зарегистрирует управляемую службу со следующими свойствами:

service.pid = [ "com.acme.host", "com.acme.system" ]

Bundle будет вызываться как для com.acme.host, так и для com.acme.system PID и, следовательно, должен различать эти два случая. Таким образом, эта управляемая служба будет иметь обратный вызов, например:

volatile URL url;
public void updated( Dictionary d ) {
if ( d.get("service.pid").equals("com.acme.host"))
    this.url = new URL( d.get("host"));
if ( d.get("service.pid").equals("com.acme.system"))
   ...
}

Я пробовал со следующим синтаксисом:

@Component(
    immediate = true,
    configurationPid = "[com.mycompany.ws.rest,com.mycompany.endpoints]",
    configurationPolicy = ConfigurationPolicy.REQUIRE
) 
public class TestImpl implements Test {
    // ...
}

но это не удается. Конечно, можно получить ссылку на config admin и просмотреть конфигурацию на основе желаемых pids, но мне это кажется немного неэлегантным, поскольку теоретически можно было бы делегировать это аннотациям ds.

Является ли это возможным? Каков правильный синтаксис?

Благодарю вас!


person matteo rulli    schedule 05.07.2015    source источник


Ответы (3)


Я не верю, что это возможно с использованием значений configurationPid и configurationPolicy. Я делаю следующее:

  • Определите идентификатор(ы) фабрики служб в качестве свойства службы.
  • Реализуйте интерфейс ManagedService.

Пример:

@Component(property = {Constants.SERVICE_PID + "=com.acme.host", 
                       Constants.SERVICE_PID + "=com.acme.system"})
public class TestComponent implements ManagedService {

    @Override
    public void updated(Dictionary<String, ?> dict) {
    ...
    }

Конечно, это имеет тот недостаток, что ваш компонент активируется, даже если для него нет конфигурации, но вы можете использовать два PID.

person Arie van Wijngaarden    schedule 05.07.2015
comment
Спасибо, это работает. Я думаю, что для решения проблемы, которую вы выделили в последнем предложении, достаточно вручную зарегистрировать актуальную службу, как только TestComponent получит все ожидаемые записи конфигурации от Config Admin, верно? - person matteo rulli; 05.07.2015
comment
Точную ситуацию не знаю, но предполагаю, что да. Помните, что SCR автоматически экспортирует сервисы, которые вы реализуете, поэтому вам, вероятно, понадобится service= в аннотации, чтобы предотвратить автоматический экспорт интерфейса сервиса. - person Arie van Wijngaarden; 06.07.2015
comment
Понятно. Большое спасибо - person matteo rulli; 06.07.2015
comment
Пара замечаний. Обновление вызывается один раз для каждого pid. Вы можете проверить, какой pid находится в словаре, используя ключ service.pid. Если вы используете общий pid пакета, убедитесь, что для вашего местоположения конфигурации установлено значение null или ?; Если нет, обновление может не вызываться. - person Steven Spungin; 04.03.2018

Несколько PID поддерживаются в готовящейся спецификации DS 1.3. См. http://www.osgi.org/Specifications/Drafts, где можно найти ссылки для загрузки черновой версии версии 6. спецификации

person BJ Hargrave    schedule 05.07.2015

В новых версиях проблема решается...

From: https://osgi.org/specification/osgi.cmpn/7.0.0/service.component.html#org.osgi.service.component.annotations.Component

112.13.4.11 String[] configurationPid по умолчанию "$" □ PID конфигурации для конфигурации этого компонента.

Каждое значение указывает PID конфигурации для этого компонента.

Если значение не указано, имя этого компонента используется в качестве PID конфигурации этого компонента.

Специальная строка ("$") может использоваться для указания имени компонента в качестве PID конфигурации. Константа NAME содержит эту специальную строку. Например:

@Component(configurationPid={"com.acme.system", Component.NAME}) Инструменты, создающие описание компонента из этой аннотации, должны заменить специальную строку на фактическое имя этого компонента.

См. также Атрибут конфигурации-pid элемента компонента описания компонента.

Начиная с 1.2

person Victor    schedule 22.12.2018