OSGi: Может ли декларативная ссылка на службу использовать целевой фильтр прототипного компонента?

osgi #declarative-services

#osgi #декларативные службы

Вопрос:

У меня есть интерфейс сервиса Logger и фабрика сервисов

 interface LoggerFactory {
    Logger createLogger(String name)
}
 

Мои компоненты используют его следующим образом:

 @Component
public class User {
    
    private Logger logger;

    @Activate
    public User(@Reference LoggerFactory loggerFactory) {
        logger = loggerFactory.create("user")
    }
}
 

Я хотел бы избавиться от LoggerFactory и вместо этого иметь возможность извлекать мой регистратор следующим образом:

 @Component
public class User {
    
    @Reference(target = "(name=user)")
    private Logger logger;

}
 

Я попытался создать прототипы реализаций регистратора, но SCR не создал регистраторы, как ожидалось. Это потому, что заводские компоненты всегда требуют configurationPID от ConfigAdmin?

Я также попытался зарегистрировать PrototypeServiceFactory для интерфейса Logger явно через контекст пакета, но безуспешно.

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

1.) Как я могу этого добиться?

2.) Если это невозможно, есть ли альтернативы? Например, иметь какую-то другую фабрику сервисов, которая использует имя компонента в качестве имени регистратора?

3.) Если это может как-то сработать, могу ли я сделать целевой фильтр необязательным, который затем выбирает не случайный регистратор, а тот, который использует имя компонента?

Ответ №1:

Свойство target — это выражение фильтра LDAP, используемое для выбора службы из реестра служб OSGi. target = "(name=user)" означает, что служба должна иметь свойство службы «name» со значением «user». Свойство target нельзя использовать для вызова службы с некоторым аргументом.

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